消息

我们只是让QuoteRequest到ActorRef去但是我们根本没见过消息类!

它是这样的:
(一个最佳实践是把你的消息类包装在一个完整的对象里以利于更好的组织)

TeacherProtocol

package me.rerun.akkanotes.messaging.protocolsobject TeacherProtocol{case class QuoteRequest()case class QuoteResponse(quoteString:String)}

就像你知道的,QuoteRequest是用来发给TeacherActor的。Actor应该响应一个QuoteResponse回来。

分发者DISPATCHER和邮箱MAILBOX

ActorRef将消息处理功能委托给Dispatcher。在底层实现中,当我们创建一个ActorSystemActorRef的时候,一个Dispatcher和一个MailBox也被创建出来了。让我们看下他们。

邮箱MailBox

Actor有一个MailBox(稍后我们会看到一个特例)。在我们的例子里,每个老师都有一个邮箱(mailbox)。老师需要检查邮箱(mailbox)并且处理消息。在Actor的世界里,是另一种样子-邮箱(mailbox),当它有机会它会使用Actor来完成它的工作。

邮箱维护一个先入先出的队列来保存和处理消息- 跟我们常规的收件箱有点不一样,常规的收件箱总是最新的邮件在最上面。

现在,分发者 dispatcher

分发者做的事很有趣。表面上看,分发者只是从ActorRef拿到消息然后将消息发给MailBox。但是在这个场景里有个很神奇的事情:

分发者包装了ExecutorService(ForkJoinPool或者ThreadPoolExecutor)。 它用这个ExecutorService来执行MailBox

看一下这个Dispathcer里的片断:

protected[akka] override def registerForExecution(mbox: Mailbox, ...): Boolean = {  ...try {executorService execute mbox...
}

什么?你说你执行MailBox?

是的。我们已经看到了MailBox将所有消息维护在一个队列里。当Executor运行MailBox时,MailBox必须是一个线程(Thread)。就是这样,这就是MailBox的声明和构造函数。

这里是Mailbox的签名

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

TEACHER ACTOR

MailBox,当它的run方法被调用时,从队列里获取一条消息并把它发给Actor来处理。

在你将消息告知(tell)ActorRef的时候一定会调用到目标Actor的receive方法。

这里的TeacherActor是个基本类,维护一个格言列表(List)并自带能处理消息的方法receive

看下这里:

TeacherActor.scala

package me.rerun.akkanotes.messaging.actormsg1import scala.util.Randomimport akka.actor.Actor
import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._/** Your Teacher Actor class. * * The class could use refinement by way of  * using ActorLogging which uses the EventBus of the Actor framework* instead of the plain old System out* */class TeacherActor extends Actor {val quotes = List("Moderation is for cowards","Anything worth doing is worth overdoing","The trouble is you think you have time","You never gonna know if you never even try")def receive = {case QuoteRequest => {import util.Random//Get a random Quote from the list and construct a responseval quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))println (quoteResponse)}}}

TeacherActor只接受一种消息格式-QuoteRequest(实际上,这个让模式匹配默认case的方式是个好实践,但这儿还是有个有趣的故事)

receive方法做的所有事是

  1. 根据模式匹配QuoteRequest

  2. 从格言的静态列表(list)中随机选取一个格言

  3. 构造一个QuoteResponse

  4. 将QuoteResponse打印到控制台

代码

完整项目可以在github下载。


文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

翻译:AKKA笔记 - Actor消息 -1(二)相关推荐

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

    原文地址 http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/ 2. SCHEDULE 可以看到在ActorSystem的API ...

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

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

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

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

  4. Akka和Actor一起工作的消息《ten》译

    Dependency 在项目中添加以下依赖项: Introduction 在前面的主题解说中,我们解释了如何构建大型的Actor系统,即如何表示组件,如何在层次结构中排列Actor.在这一部分中,我们 ...

  5. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  6. Akka的Hello World(一)Akka的Actor架构

    一. Actor层次结构 Akka的Actor总会有他的父母.通常,您通过调用getContext().actorOf()创建一个actor .这不是创建一个"独立"Actor,而 ...

  7. Akka之actor模型

    一 定义Actor import akka.actor.{Props, ActorSystem, Actor} import akka.actor.Actor.Receive import akka. ...

  8. 区块链分片:《Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones》论文翻译个人笔记

    区块链分片:<Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones>论文翻译个人笔记 日期:2019年2月26- ...

  9. spark 如何用netty实现akka的actor模型

    Spark的中,通过netty实现了类似akka的actor机制. 在spark中,一个EndPointData就类似一个akka中的actor. private class EndpointData ...

最新文章

  1. html js什么作用,html錨點的作用和js選項卡錨點跳轉的使用
  2. fusioncharts同一页面显示2个仪表盘,且以java字符串作为xml数据
  3. 实现WM下删除最后一条匹配的通话记录
  4. LeetCode 294. 翻转游戏 II(记忆化递归)
  5. Metasploit基础和基本命令详解
  6. 啃碎并发(二):Java线程的生命周期
  7. maven install 错误
  8. OpenStack安装流程(juno版)- 添加镜像服务(glance)
  9. linux下vasp安装
  10. 使用matlab进行三角函数拟合
  11. 树莓派简易快速安装OpenCV4
  12. 接口(interface、implement)
  13. axure rp pro入门
  14. chapter4.面对对象
  15. MATLAB中dither抖动函数的用法
  16. 史济怀20180915_1 有限覆盖定理
  17. 计算机本科毕业设计-智能分类垃圾桶
  18. RabbitMQ学习笔记:内存(Memory)|磁盘空间(Disk space)阀值
  19. Oracle中的chr()函数 和 ascii()函数
  20. 医学图像处理开源软件集合

热门文章

  1. Android UI Button 和GridView 的设计--优化(2)
  2. 使用正则表达式抽取新闻/BBS网页发表时间
  3. vmware 添加 磁盘 空间
  4. 【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
  5. SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
  6. linux下bus、devices和platform的基础模型
  7. 一年计划-献给我已经逝去的青春(初出茅庐的小白)
  8. 一个mongosee例子
  9. 终端bash美化(FC)
  10. 区块链从一夜暴富到一夜暴“负”的辛酸史