从第一篇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(一)的更多相关文章

  1. [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3

    上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...

  2. 翻译:AKKA笔记 - Actor消息 -1(二)

    消息 我们只是让QuoteRequest到ActorRef去但是我们根本没见过消息类! 它是这样的: (一个最佳实践是把你的消息类包装在一个完整的对象里以利于更好的组织) TeacherProtoco ...

  3. [翻译]AKKA笔记 -ACTOR SUPERVISION - 8

    失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...

  4. [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

    原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...

  5. [翻译]AKKA笔记 - 有限状态机 -1

    原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...

  6. [翻译]AKKA笔记 - DEATHWATCH -7

    当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...

  7. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6

    原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...

  8. [翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

    原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 像我们前面看到的,我们可以用ActorSystem的actorof方 ...

  9. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)

    3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...

随机推荐

  1. IE8的兼容性问题

    IE的兼容性问题是前端开发人员的老大难问题,不过随着时代的发展,IE6逐渐的被淘汰,现在以及很少有网站兼容IE6了,一般都兼容到IE8,现在我总结了一些IE8的兼容性问题及解决方法. 1.使用meta ...

  2. 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    public class Five_05 { public static void main(String[] args) { Scanner input=new Scanner(System.in) ...

  3. QQ在线客服JS代码,自适应漂浮在网页右侧

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  4. PHP 通过设置P3P头来实现跨域访问COOKIE

    CentOS的系统(Linux 内核) 编辑HOST vi /etc/hosts 加入127.0.0.1 www.a.com127.0.0.1 www.b.com 首先:创建 a_setcookie. ...

  5. css3 自定义动画(1)

    <style> /*@-webkit-keyframes 动画名称 {} 用时:-webkit-animation:时间 动画名称; */ /* @-webkit-keyframes mo ...

  6. 第十四章:降维:奇异值分解SVD

  7. C#基于Office组件操作Excel

    1.    内容简介 实现C#与Excel文件的交互操作,实现以下功能: a)     DataTable 导出到 Excel文件 b)     Model数据实体导出到 Excel文件[List&l ...

  8. Excel公式设置单元格颜色

    Excel2010 “条件格式"-"新建规则"-"使用公式确定要设置格式的单元格" 公式如下: =OR(H2<=-20%,H2>=20%, ...

  9. C++ 中 int 转string, 以及10进制转2进制

    感谢:http://blog.csdn.net/xiaofei2010/article/details/7434737 以及:http://www.cnblogs.com/nzbbody/p/3504 ...

  10. javascript练习-扑克牌

    下面用枚举类型来实现一副扑克牌的类: //定义一个玩牌的类 function Card(suit,rank){ function inherit(p){ if(p==null) throw TypeE ...