当前位置: 首页 > 编程日记 > 正文

翻译:AKKA笔记 - Actor消息 -1(二)

消息

我们只是让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」。转载请注明。
图片描述

相关文章:

远程安装oracle 10.2.1 for redhat 5.0 2.6.18-53.el5xen

远程安装oracle <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" />10.2.1 for redhat 5.0 2.6.18-53.el5xen<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />今天有个朋友打电…

伯克利新无监督强化学习方法:减少混沌所产生的突现行为

作者 | Glen Berseth译者 | Arvin编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】所有生命有机体都在环境中占据一席之地&#xff0c;使它们在周围不断增加的熵中可以保持相对可预测性。例如&#xff0c;人类竭尽全力保护自己免受意外袭击--我们…

朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll、Epoll模型处理长连接性能比较

在《朴素、Select、Poll和Epoll网络编程模型实现和分析——模型比较》一文中&#xff0c;我们分析了各种模型在处理短连接时的能力。本文我们将讨论处理长连接时各个模型的性能。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 我们可以想象下场景&#xff0c…

Topcoder SRM 663 DIV 1

ABBADiv1 题意&#xff1a; 规定两种操作&#xff0c;一种是在字符串的末尾添加A&#xff0c;另一种是在末尾添加B然后反转字符串。现在给你一个起始串&#xff0c;一个终点串&#xff0c;然后问你是否能够通过以上两种操作&#xff0c;从起始串变为终点串。 题解&#xff1a; …

跨平台PHP调试器设计及使用方法——立项

作为一个闲不住且希望一直能挑战自己的人&#xff0c;我总是在琢磨能做点什么。自从今年初开始接触PHP&#xff0c;我也总想能在这个领域内产生点贡献。那能做点什么呢&#xff1f;我经常看到很多phper说自己设计了一个什么框架&#xff0c;或者说自己搭建了一个什么系统。虽然…

机器推理文本+视觉,跨模态预训练新进展

作者 | 李根、段楠、周明来源 | 微软研究院AI头条&#xff08;ID:MSRAsia&#xff09;【导读】机器推理要求利用已有的知识和推断技术对未见过的输入信息作出判断&#xff0c;在自然语言处理领域中非常重要。本文将介绍微软亚洲研究院在跨模态预训练领域的研究进展。近年来&…

[LeetCode]:94:Binary Tree Inorder Traversal

题目&#xff1a; Given a binary tree, return the inorder traversal of its nodes values. For example:Given binary tree {1,#,2,3}, 1\2/3return [1,3,2]. 代码&#xff1a; public class Solution {public static ArrayList<Integer> listResult new ArrayList&l…

腾讯 AI 2019这一年

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送近日&#xff0c;腾讯AI实验室总结了 2019 年其取得重大进展的两大研究方向&#xff0c;推动实现的行业应用以及前沿研究探索方面的成果。一、两大难题攻坚&#xff1a;通用人工智能与数字人用…

跨平台PHP调试器设计及使用方法——探索和设计

在《跨平台PHP调试器设计及使用方法——立项》一文中&#xff0c;我确定了使用xdebug作为调试器插件部分的基础组件。xdebug提供了一个远程调试的功能&#xff08;相关资料可以详见https://xdebug.org/docs/remote&#xff09;&#xff0c;我们这个项目便是基于这个功能实现的。…

Ubuntu下允许Root用户直接登录图形界面

ubuntu root是默认禁用了&#xff0c;不允许用root登陆&#xff0c;所以先要设置root密码。 执行&#xff1a;sudo passwd root 接着输入密码和root密码&#xff0c;重复密码。再重新启动就可以用root登陆。 另外&#xff0c;默认情况下是不允许用root帐号直接登陆图形界面的。…

携程App for Apple Watch探索

在Apple Watch发布之后&#xff0c;很多App都针对它设计了相应的版本。旅行作为与Apple Watch时间管理特性契合度较高的场景&#xff0c;同时携程旅行作为国内领先的OTA行业App&#xff0c;也成为了首批适配Apple Watch并荣登Apple官网和App Store推荐的应用之一。InfoQ就App f…

跨平台PHP调试器设计及使用方法——通信

首先引用《跨平台PHP调试器设计及使用方法——探索和设计》中的结构图&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 本文要介绍的是我们逻辑和pydbgp通信的实现&#xff08;图中红框内内容&#xff09;。 设计通信之前&#xff0c;我需要先设计一种通信协议…

MVP模式的相关知识

MVP 是从经典的模式MVC演变而来&#xff0c;它们的基本思想有相通的地方&#xff1a;Controller/Presenter负责逻辑的处理&#xff0c;Model提供数据&#xff0c;View负责显示。作为一种新的模式&#xff0c;MVP与MVC有着一个重大的区别&#xff1a;在MVP中View并不直接使用Mod…

“数学不行,还能干点啥?”面试官+CTO:干啥都费劲!

关于数学与程序员的“暧昧”关系&#xff0c;先看看网友的看法&#xff1a;同时编程圈也流传着一个段子&#xff1a;一流程序员靠数学&#xff0c;二流程序员靠算法&#xff0c;末端程序员靠百度&#xff0c;低端看高端就是黑魔法。想一想&#xff0c;我们日常学习、求职、工作…

CentOS7 yum 源的配置与使用

YUM&#xff1a;Yellowdog Updater Modified Yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖…

跨平台PHP调试器设计及使用方法——协议解析

在《跨平台PHP调试器设计及使用方法——探索和设计》一文中&#xff0c;我介绍了将使用pydbgp作为和Xdebug的通信库&#xff0c;并让pydbgp以&#xff08;孙&#xff09;子进程的方式存在。《跨平台PHP调试器设计及使用方法——通信》解决了和pydbgp通信的问题&#xff0c;本文…

测试客户端发图图

转载于:https://blog.51cto.com/ericsong/116942

搜狐、美团、小米都在用的Apache Doris有什么好? | BDTC 2019

【导读】12 月 5-7 日&#xff0c;由中国计算机学会主办&#xff0c;CCF 大数据专家委员会承办&#xff0c;CSDN、中科天玑协办的中国大数据技术大会&#xff08;BDTC 2019&#xff09;在北京长城饭店隆重举行。100 顶尖技术专家、1000 大数据从业者齐聚于此&#xff0c;以“大…

cacti邮件告警设置

功能说明对指定流量图形&#xff08;指定接口&#xff09;设置最高或最低流量阀值&#xff0c;当流量出现异常偏高或偏低触发阀值&#xff0c;系统自动将异常信息以邮件形式通知指定收件人。如果收件人邮箱是139邮箱&#xff0c;还可以增设短信通知功能。设置前准备设置该功能之…

跨平台PHP调试器设计及使用方法——高阶封装

在《跨平台PHP调试器设计及使用方法——协议解析》一文中介绍了如何将pydbgp返回的数据转换成我们需要的数据。我们使用该问中的接口已经可以构建一个简单的调试器。但是由于pydbgp存在的一些问题&#xff0c;以及调试器需要的一些高级功能&#xff0c;我们还需要对这些接口进行…

Oracle的口令文件(passwordfile)的讲解(摘录)

初学oracle&#xff0c;很多概念迷糊&#xff0c;今天看到这文章&#xff0c;让我有一个比较清晰的认识。转载[url]http://www.itpub.net/viewthread.php?tid906008&extra&page1[/url]1、os认证oracle安装之后默认情况下是启用了os认证的&#xff0c;这里提到的os认证…

如何优雅地使用pdpipe与Pandas构建管道?

作者 | Tirthajyoti Sarkar译者 | 清儿爸编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 【导读】Pandas 是 Python 生态系统中的一个了不起的库&#xff0c;用于数据分析和机器学习。它在 Excel/CSV 文件和 SQL 表所在的数据世界与 Scikit-learn 或 Te…

第 十 天 : 添 加 硬 盘 和 分 区 挂 载 等

小Q&#xff1a;狼若回头&#xff0c;必有缘由&#xff0c;不是报恩&#xff0c;就是***&#xff1b; 事不三思必有败&#xff0c;人能百忍则无忧。今天的进度虽然慢了&#xff0c;但是学习状态还是一如往常&#xff0c;只不过今天遇到了不少新的知识点&#xff0c;需要好好想想…

从4个月到7天,Netflix开源Python框架Metaflow有何提升性能的魔法?

作者 | Rupert Thomas译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】Metaflow 是由 Netflix 开发&#xff0c;用在数据科学领域的 Python框架&#xff0c;于 2019 年 12 月正式对外开源。据介绍&#xff0c;Metaflow 解决…

SOA标准发展混乱 国内业务缺少经验

近年来&#xff0c;SOA已经成为国际及我国信息技术领域的重大热点之一。从2005年至今&#xff0c;SOA逐渐成为影响中国IT系统构建的主导思想。从2006年开始&#xff0c;SOA的建设方法已在我国部分行业信息化项目中开始得以越来越广泛的应用。 但热潮背后&#xff0c; SOA概念在…

跨平台PHP调试器设计及使用方法——界面设计和实现

一个优秀的交互设计往往会影响一个产品的命运。在设计这款调试器时&#xff0c;我一直在构思这款调试器该长什么样子。简单、好用是我设计的原则&#xff0c;于是在《跨平台PHP调试器设计及使用方法——立项》一文中&#xff0c;我给出了一个Demo。之后实现的效果也与之变化并不…

AJAX安全-Session做Token

个人思路&#xff0c;请大神看到了指点 个人理解token是防止扫号机或者恶意注册、恶意发表灌水&#xff0c;有些JS写的token算法&#xff0c;也会被抓出来被利用&#xff0c;个人感觉还是用会过期的Session做token更好&#xff0c;服务器存储&#xff0c;加载到客户端页面&…

跨平台PHP调试器设计及使用方法——使用

经过之前六篇博文的分析和介绍&#xff0c;大家应该对这套调试器有个初步的认识。本文我将讲解它的使用方法。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 上图是该软件界面的布局&#xff0c;我们之后的讲解也将围绕着这些功能展开。 文件夹管理 在查看一…

管理7k+工作流,月运行超10000万次,Lyft开源的Flyte平台意味着什么?

作者 | Allyson Gale译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】Flyte 平台可以更容易的创建并发&#xff0c;可伸缩和可维护的工作流&#xff0c;从而进行机器学习和数据处理。Flyte 已有三年多的训练模型和数据处理经…

Jmeter组件执行顺序与作用域

一、Jmeter重要组件&#xff1a; 1&#xff09;配置元件---Config Element&#xff1a;  用于初始化默认值和变量&#xff0c;以便后续采样器使用。配置元件大其作用域的初始阶段处理&#xff0c;配置元件仅对其所在的测试树分支有效&#xff0c;如&#xff0c;在同一个作用域…