欢迎关注大数据技术架构与案例微信公众号:过往记忆大数据
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
过往记忆大数据

Akka学习笔记:Actor消息传递(1)

  从前面的《Akka学习笔记:ACTORS介绍》,我们已经简单地了解了Actors。在这篇笔记中,我们将介绍Actor的消息传递。作为例子,我们将继续使用前面介绍的 Student-Teacher模型。
  在Actor消息传递的前部分,我们将创建Teacher Actor而不是Student Actor,我们将用一个称为StudentSimulatorApp的主程序。

详细回顾Student-Teacher模型

  我们现在考虑消息从StudentSimulatorApp单独发送到TeacherActor。这里所说的StudentSimulatorApp只不过是一个简单的主程序。


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

  这副图片解释如下:
  1、Student创建了一些东西,称为ActorSystem;
  2、他用ActorSystem来创建一个ActorRef,并将QuoteRequest message发送到ActorRef 中(到达TeacherActor的一个代理);
  3、ActorRef 将message单独传输到Dispatcher;
  4、Dispatcher将message按照顺序保存到目标Actor的MailBox中;
  5、然后Dispatcher将Mailbox放在一个Thread 中(更多详情将会在下节中进行介绍);
  6、MailBox按照队列顺序取出消息,并最终将它递给真实的TeacherActor接受方法中。
就像我所说的,不用担心。我们现在来一步一步地了解详情,当了解完详情之后,你可以返回来回顾上面六步。

StudentSimulatorApp程序

  我们将通过StudentSimulatorApp程序来启动JVM,并且初始化ActorSystem。


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

  正如我们从图中了解到,StudentSimulatorApp程序
  1、创建一个ActorSystem;
  2、用创建好的ActorSystem来创建一个通往Teacher Actor的代理 (ActorRef)
  3、将QuoteRequest message 发送到这个代理中。
  让我们单独探讨这三点。

1、创建一个ActorSystem

  ActorSystem是进入Actor世界的切入点,通过ActorSystem你可以创建和停止Actors,甚至关掉整个Actor环境!
  另一方面,Actor是一个体系,ActorSystem类似于java.lang.Object or scala.Any,能够容纳所有的Actor!它是所有的Actor的父类。当你创建一个Actor,你可以用ActorSystem的actorOf方法。


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

  初始化ActorSystem的代码类似下面:

val system=ActorSystem("UniversityMessageSystem")

UniversityMessageSystem就是你给ActorSystem取得名字。

2、为Teacher Actor创建代理

  让我们看下下面的代码片段:

 val teacherActorRef:ActorRef=actorSystem.actorOf(Props[TeacherActor])

   actorOf是ActorSystem中创建Actor的方法。但是正如你所看到的,它并不返回我们所需要的TeacherActor对象,它的返回类型为ActorRef。
   ActorRef为真实Actor的充当代理,客户端并不直接和Actor进行通信。这就是Actor Model中的处理方式,该方式避免直接进入TeacherActor或者任何Actor中的任何custom/private方法或者变量。
  你仅仅将消息发送到ActorRef ,该消息最终发送到你的Actor中,你无法直接和你的Actor进行直接通信。如果你那样做,有人会恨你到死!!(这么严重?)


如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

3、将QuoteRequest message 发送到代理中

   你仅仅告诉(tell)QuoteRequest message到ActorRef中,Actor中的tell方法是! 如下:

//send a message to the Teacher Actor
  teacherActorRef!QuoteRequest

StudentSimulatorApp 的完整代码如下:

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方法来shutdownActorSystem ,否则,JVM会继续运行!我在程序中调用了 Thread.sleep (2000) 来休眠,这看起来很傻,但是你不用担心,在后面我将会创建许多的测试用例来避免这些。

   由于篇幅问题,剩下的内容在《Akka学习笔记:Actor消息传递(2)》里。
   本文翻译自:http://rerun.me/2014/09/19/akka-notes-actor-messaging-1/

本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【Akka学习笔记:Actor消息传递(1)】(https://www.iteblog.com/archives/1155.html)
喜欢 (40)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
(5)个小伙伴在吐槽