翻译:AKKA笔记 - Actor消息 -1(一)
从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors。在这篇笔记的第二篇,我们会看一下Actors中的消息部分。而且延续上一次的例子,我们还会使用同样的学生与老师的例子。
在Actor消息的第一部分,我们会建立一个Teacher Actor,而且会使用一个叫StudentSimulatorApp的主程序。
回顾学生-老师模式的细节##
现在考虑下StudentSimulatorApp单独发消息给TeacherActor。当我说到StudentSimulatorApp,就只是意思是一个常规的带main函数的主程序。
这张图传递的意思是:
(如果太复杂,别担心,我们会详细过一遍)
1.学生创建了一个叫ActorSystem的东西
2.它用ActorSystem来创建一个叫ActorRef的东西。QuoteRequest消息被发送到ActorRef(一个TeacherActor的代理)
3.Actor ref同样把消息发给Dispatcher
4.Dispatcher将消息放入到目标Actor的邮箱中(MailBox)
5.Dispatcher将Mail放到一个线程中(下节详细介绍)
6.MailBox取出一个消息并且最后将消息送给实际的Teacher Actor的接收方法。
就像我说的,别担心。下面我们看看每一步的细节。你可以在后面重新回来看下这五步。
STUDENTSIMULATORAPP程序##
我们用StudentSimulatorApp启动JVM并且初始化ActorSystem。
就像图片上画的,这个StudentSimulatorApp
1.创建了一个ActorSystem
2.使用ActorSustem创建了一个Teacher Actor的代理(ActorRef)
3.给代理发送QuoteRequest(请求格言)消息。
让我们一起看下这三点。
1.创建 一个ActorSystem###
ActorSystem是一个进入Actor世界的入口点。ActorSystem在创建和停止Actors的时候自始至终都存在着。并且在关掉整个Actor环境的时候也存在着。
在另一个方面,Actors是按层级划分的,ActorSystem可以类比为对于所有Actor的java.lang.Object基类对象或者scala.Any- 意思是它是所有Actors的根对象。当你用ActorSystem的actorof方法创建了一个Actor对象,你实际上创建了一个ActorSystem下一个一个子Actor。
初始化ActorSystem的代码类似于这个样子
val system=ActorSystem("UniversityMessageSystem")
这里的UniversityMessageSystem就是一个你给ActorSystem的昵称。
2.创建一个TeacherActor的代理?###
让我们看下下面的片段:
'val teacherActorRef:ActorRef=actorSystem.actorOf(props[TeacherActor])'
actorOf是ActorSystem中的Actor的创建方法。但是,你可以看见这个方法并不返回一个TeacherActor。它返回一个类型是ActorRef的东西。
ActorRef是一个真实Actors的代理。客户端并不直接跟Actor对话。这这种Actor的模型是为了防止TeacherActor的自定义/私有方法或变量被直接访问。
你只会直接给ActorRef发送消息并且消息最终会到达实际的Actor。你永远不能直接跟Actor交互。要是你找到一些方式干这个,你会被大家诅咒。
3.给代理发送一个QuoteRequest###
你只需要将QuoteRequest消息tell告诉ActorRef。这个告诉的方法在Actor里面是!叹号。(ActorRef也有一个tell方法,作用是委托回调给!)
'//send a message to the Teacher Actor'
'teacherActorRef!QuoteRequest'
这就没了!
如果你觉得我骗你,下面是StudentSimulatorApp的代码:
STUDENTSIMULATORAPP.SCALA###
package me.rerun.akkanotes.messaging.actormsg1
import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.actorRef2Scala
import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._
object StudentSimulatorApp extends App{
//Initialize the ActorSystem
val actorSystem=ActorSystem("UniversityMessageSystem")
//construct the Teacher Actor Ref
val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])
//send a message to the Teacher Actor
teacherActorRef!QuoteRequest
//Let's wait for a couple of seconds before we shut down the system
Thread.sleep (2000)
//Shut down the ActorSystem.
actorSystem.shutdown()
}
不过,我确实撒了一个小慌。你需要shutdown ActorSystem或者让JVM一直跑。我给这个main线程sleep一下只是为了给TeacherActor一点时间来完成它的任务。我知道这听起来有点傻。别担心这个。我们后面会写一些测试用例来避免这个。
这是我翻译的文章,原文在http://rerun.me/2014/09/19/akka-notes-actor-messaging-1/
文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。
翻译:AKKA笔记 - Actor消息 -1(一)的更多相关文章
- [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3
上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...
- 翻译:AKKA笔记 - Actor消息 -1(二)
消息 我们只是让QuoteRequest到ActorRef去但是我们根本没见过消息类! 它是这样的: (一个最佳实践是把你的消息类包装在一个完整的对象里以利于更好的组织) TeacherProtoco ...
- [翻译]AKKA笔记 -ACTOR SUPERVISION - 8
失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...
- [翻译]AKKA笔记 - 有限状态机 -1
原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...
- [翻译]AKKA笔记 - DEATHWATCH -7
当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...
- [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...
- [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)
原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...
- [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)
3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...
随机推荐
- 收藏的 500多个开源的Git源码
由dkhamsing发起的Open-Source iOS Apps收集了各种开源的iOS App,并进行了详细的分类,比如游戏.社交.健康.键盘.定位.多媒体.新闻.办公.安全以及小工具类等.截至目前 ...
- seaJS 简单例子,理解seaJS
学习心得: 记得第一次学underscore的时候,去的官网(不管什么都是官网好),呼啦一长列语法,我就一个个看,看完也不知道underscore是做什么的.就是现在underscore我也用不上,学 ...
- Zepto 实现checkbox全选与全不选状态切换
最近项目里用到foundation,而foundation4默认集成了Zepto,很多轮子要重造,所以有了下面的代码. <script> /** * Muti-Checking-Toggl ...
- iOS 单例模式
主要用于做应用程序的资源共享控制.用途很多⋯⋯ 实质为,单例是在程序声明周期里 有且仅有 被实例化过一次的类.为确保实例化的唯一,利用类的 类(static)方法来生成和访问对象. 至此,你便可以在程 ...
- Features
imhist分析灰度图阈值分界点 bwlabel分析连通区域 SIFT Scale Invariant:尺度不变性 DoG: Difference of Gaussian, calculated by ...
- 使用WindowsPE破解管理员密码
使用WindowsPE破解管理员密码 1将操作系统关闭,编辑虚拟机设置,先用老毛桃生成一个ISO,点.iso制作,再点生成ISO文件,然后选择WinPE的ISO镜像存放的位置 将WinPE.ISO文件 ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...
- express 转
目录 此文重点介绍Express3.0的开发框架,其中还会涉及到Mongoose,Ejs,Bootstrap等相关内容.Express已经升级到4.x,请同时参考文章,Node.js开发框架Expre ...
- MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本
介绍MongoDB支持的一些高级功能: 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一 ...
- RTS与CTS的含义
====================================我是分割线首先介绍下网上看到的================================================= ...