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

10 篇文章 0 订阅

消息

   我们在前面仅仅讨论了ActorRef的QuoteRequest,并没有看到message的类!这里将介绍,代码如下:

1 package me.rerun.akkanotes.messaging.protocols
2  
3 object TeacherProtocol{
4  
5   case class QuoteRequest()
6   case class QuoteResponse(quoteString:String)
7  
8 }

   正如你说知,QuoteRequest是用来给TeacherActor发送消息的;而Actor将会用QuoteResponse来响应。

DISPATCHER AND A MAILBOX

   ActorRef取出消息并放到Dispatcher中。在这种模式下,当我们创建了ActorSystem 和ActorRef,Dispatcher和MailBox也将会创建。让我们来看看这到底是什么:


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

1、MailBox

   每个Actor都有一个MailBox(后面我们将看到一个特殊情况)。在我们之前的模型中,每个Teacher也有一个MailBox。Teacher需要检查MailBox并处理其中的message。MailBox中有个队列并以FIFO方式储存和处理消息。

2、Dispatcher

   Dispatcher做一些很有趣的事。从图中可以看到,Dispatcher好像只是仅仅将message从ActorRef 传递到MailBox中。但是在这背后有件很奇怪的事:Dispatcher 包装了一个 ExecutorService (ForkJoinPool 或者 ThreadPoolExecutor).它通过ExecutorService运行 MailBox。代码片段如下:

1 protected[akka] override def registerForExecution(mbox: Mailbox, ...): Boolean =
2     ...
3     try {
4         executorService execute mbox
5     ...
6 }

   什么?你说是你来运行Mailbox?是的,我们前面已经看到Mailbox的队列中持有所有的消息。用executorService 运行Mailbox也一样。Mailbox必须是一个线程。代码中有大量的Mailbox的声明和构造函数,代码片段如下:

1 private[akka] abstract class Mailbox(val messageQueue: MessageQueue)
2                           extends SystemMessageQueue with Runnable

Teacher Actor


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

   当MailBox的run方法被运行,它将从队列中取出消息,并传递到Actor进行处理。该方法最终在你将消息tell到ActorRef 中的时候被调用,在目标Actor其实是个receive 方法。TeacherActor 是基本的类,并且拥有一系列的quote,很明显,receive 方法是用来处理消息的。代码片段如下:

01 package me.rerun.akkanotes.messaging.actormsg1
02  
03 import scala.util.Random
04  
05 import akka.actor.Actor 
06 import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._
07  
08 /*
09  * Your Teacher Actor class.
10  *
11  * The class could use refinement by way of 
12  * using ActorLogging which uses the EventBus of the Actor framework
13  * instead of the plain old System out
14  *
15  */
16  
17 class TeacherActor extends Actor {
18  
19   val quotes = List(
20     "Moderation is for cowards",
21     "Anything worth doing is worth overdoing",
22     "The trouble is you think you have time",
23     "You never gonna know if you never even try")
24  
25   def receive = {
26  
27     case QuoteRequest => {
28  
29       import util.Random
30  
31       //Get a random Quote from the list and construct a response
32       val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
33  
34       println (quoteResponse)
35  
36     }
37  
38   }
39  
40 }

  TeacherActor的receive只匹配一种消息:QuoteRequest ,receive方法主要做以下几件事:
  1、匹配QuoteRequest;
  2、从quotes中随机取出一个quote;
  3、构造一个QuoteResponse;
  4、在控制台打印QuoteResponse

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值