您的位置:首页 > 其它

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

2016-06-15 16:42 579 查看
文章目录[hide]

1消息

2DISPATCHERANDAMAILBOX

2.11、MailBox

2.22、Dispatcher

3TeacherActor


消息

  我们在前面仅仅讨论了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来响应。


DISPATCHERANDAMAILBOX

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

1
private
[akka]
abstract

class
Mailbox(
val

messageQueue
:

MessageQueue)
2
extends

SystemMessageQueue
with

Runnable


TeacherActor





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

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

01
package

me.rerun.akkanotes.messaging.actormsg
1
02
03
import

scala.util.Random
04
05
import

akka.actor.Actor
06
import

me.rerun.akkanotes.messaging.protocols.TeacherProtocol.
_
07
08
/*
09
*
YourTeacherActorclass.
10
*
11
*
Theclasscoulduserefinementbywayof
12
*
usingActorLoggingwhichusestheEventBusoftheActorframework
13
*
insteadoftheplainoldSystemout
14
*
15
*/
16
17
class


TeacherActor
extends


Actor{
18
19
val


quotes
=

List(
20
"Moderation
isforcowards"
,
21
"Anything
worthdoingisworthoverdoing"
,
22
"The
troubleisyouthinkyouhavetime"
,
23
"You
nevergonnaknowifyounevereventry"
)
24
25
def


receive
=

{
26
27
case


QuoteRequest
=
>{
28
29
import

util.Random
30
31
//Get
arandomQuotefromthelistandconstructaresponse
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: