Akka学习笔记:Actor消息传递(2)
2016-06-15 16:42
579 查看
文章目录[hide]
1消息
2DISPATCHERANDAMAILBOX
2.11、MailBox
2.22、Dispatcher
3TeacherActor
我们在前面仅仅讨论了ActorRef的QuoteRequest,并没有看到message的类!这里将介绍,代码如下:
正如你说知,QuoteRequest是用来给TeacherActor发送消息的;而Actor将会用QuoteResponse来响应。
ActorRef取出消息并放到Dispatcher中。在这种模式下,当我们创建了ActorSystem和ActorRef,Dispatcher和MailBox也将会创建。让我们来看看这到底是什么:
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
每个Actor都有一个MailBox(后面我们将看到一个特殊情况)。在我们之前的模型中,每个Teacher也有一个MailBox。Teacher需要检查MailBox并处理其中的message。MailBox中有个队列并以FIFO方式储存和处理消息。
Dispatcher做一些很有趣的事。从图中可以看到,Dispatcher好像只是仅仅将message从ActorRef传递到MailBox中。但是在这背后有件很奇怪的事:Dispatcher包装了一个ExecutorService(ForkJoinPool或者ThreadPoolExecutor).它通过ExecutorService运行MailBox。代码片段如下:
什么?你说是你来运行Mailbox?是的,我们前面已经看到Mailbox的队列中持有所有的消息。用executorService运行Mailbox也一样。Mailbox必须是一个线程。代码中有大量的Mailbox的声明和构造函数,代码片段如下:
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
当MailBox的run方法被运行,它将从队列中取出消息,并传递到Actor进行处理。该方法最终在你将消息tell到ActorRef中的时候被调用,在目标Actor其实是个receive方法。TeacherActor是基本的类,并且拥有一系列的quote,很明显,receive方法是用来处理消息的。代码片段如下:
TeacherActor的receive只匹配一种消息:QuoteRequest,receive方法主要做以下几件事:
1、匹配QuoteRequest;
2、从quotes中随机取出一个quote;
3、构造一个QuoteResponse;
4、在控制台打印QuoteResponse
消息
我们在前面仅仅讨论了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 | } |
DISPATCHERANDAMAILBOX
ActorRef取出消息并放到Dispatcher中。在这种模式下,当我们创建了ActorSystem和ActorRef,Dispatcher和MailBox也将会创建。让我们来看看这到底是什么:如果想及时了解
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 | } |
1 | private [akka] abstract class Mailbox( val messageQueue : MessageQueue) |
2 | extends SystemMessageQueue with Runnable |
TeacherActor
如果想及时了解
当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 | * |
10 | * |
11 | * |
12 | * |
13 | * |
14 | * |
15 | */ |
16 |
17 | class
extends
|
18 |
19 | val
= List( |
20 | "Moderation , |
21 | "Anything , |
22 | "The , |
23 | "You ) |
24 |
25 | def
= { |
26 |
27 | case
= >{ |
28 |
29 | import util.Random |
30 |
31 | //Get |
32 | val quoteResponse = QuoteResponse(quotes(Random.nextInt(quotes.size))) |
33 |
34 | println (quoteResponse) |
35 |
36 | } |
37 |
38 | } |
39 |
40 | } |
1、匹配QuoteRequest;
2、从quotes中随机取出一个quote;
3、构造一个QuoteResponse;
4、在控制台打印QuoteResponse
相关文章推荐
- mk文件里面引用jar包或者so库
- 关于mysql删除语句的子查询问题
- 项目CSS架构
- JAVA File类
- Android 应用没有桌面图标
- 高油压用先导式卸荷溢流阀(安全阀)常见问题
- linux centOS装完laravel5访问public空白总结(最详细)
- linux centOS装完laravel5访问public空白总结(最详细)
- Android TraceView的使用
- haproxy tcp可用配置
- LeetCode:Jump Game II
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
- verilog中always块延时总结
- count-numbers-with-unique-digits
- Precision and Recall
- scanf和cin的区别
- MAC平台下Xcode配置使用OpenCV的具体方法 (2016最新)
- css盒子模型
- 聚合索引和非聚合索引简单介绍
- 图片内存复制性能对比