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

从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors。在这篇笔记的第二篇,我们会看一下Actors中的消息部分。而且延续上一次的例子,我们还会使用同样的学生与老师的例子。

在Actor消息的第一部分,我们会建立一个Teacher Actor,而且会使用一个叫StudentSimulatorApp的主程序。

回顾学生-老师模式的细节

现在考虑下StudentSimulatorApp单独发消息给TeacherActor。当我说到StudentSimulatorApp,就只是意思是一个常规的带main函数的主程序。

这张图传递的意思是:
(如果太复杂,别担心,我们会详细过一遍)
1.学生创建了一个叫ActorSystem的东西
2.它用ActorSystem来创建一个叫ActorRef的东西。QuoteRequest消息被发送到ActorRef(一个TeacherActor的代理)
3.Actor ref同样把消息发给Dispatcher
4.Dispatcher将消息放入到目标Actor的邮箱中(MailBox
5.Dispatcher将Mail放到一个线程中(下节详细介绍)
6.MailBox取出一个消息并且最后将消息送给实际的Teacher Actor的接收方法。

就像我说的,别担心。下面我们看看每一步的细节。你可以在后面重新回来看下这五步。

STUDENTSIMULATORAPP程序

我们用StudentSimulatorApp启动JVM并且初始化ActorSystem。

就像图片上画的,这个StudentSimulatorApp
1.创建了一个ActorSystem
2.使用ActorSustem创建了一个Teacher Actor的代理(ActorRef)
3.给代理发送QuoteRequest(请求格言)消息。

让我们一起看下这三点。

1.创建 一个ActorSystem

ActorSystem是一个进入Actor世界的入口点。ActorSystem在创建和停止Actors的时候自始至终都存在着。并且在关掉整个Actor环境的时候也存在着。

在另一个方面,Actors是按层级划分的,ActorSystem可以类比为对于所有Actor的java.lang.Object基类对象或者scala.Any- 意思是它是所有Actors的根对象。当你用ActorSystem的actorof方法创建了一个Actor对象,你实际上创建了一个ActorSystem下一个一个子Actor。

初始化ActorSystem的代码类似于这个样子

val system=ActorSystem("UniversityMessageSystem")

这里的UniversityMessageSystem就是一个你给ActorSystem的昵称。

2.创建一个TeacherActor的代理?

让我们看下下面的片段:

‘val teacherActorRef:ActorRef=actorSystem.actorOf(props[TeacherActor])’

actorOf是ActorSystem中的Actor的创建方法。但是,你可以看见这个方法并不返回一个TeacherActor。它返回一个类型是ActorRef的东西。

ActorRef是一个真实Actors的代理。客户端并不直接跟Actor对话。这这种Actor的模型是为了防止TeacherActor的自定义/私有方法或变量被直接访问。

你只会直接给ActorRef发送消息并且消息最终会到达实际的Actor。你永远不能直接跟Actor交互。要是你找到一些方式干这个,你会被大家诅咒。

3.给代理发送一个QuoteRequest

你只需要将QuoteRequest消息tell告诉ActorRef。这个告诉的方法在Actor里面是叹号。(ActorRef也有一个tell方法,作用是委托回调给

‘//send a message to the Teacher Actor’
‘teacherActorRef!QuoteRequest’

这就没了!

如果你觉得我骗你,下面是StudentSimulatorApp的代码:

STUDENTSIMULATORAPP.SCALA

package me.rerun.akkanotes.messaging.actormsg1

import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.actorRef2Scala
import me.rerun.akkanotes.messaging.protocols.TeacherProtocol._

object StudentSimulatorApp extends App{

  //Initialize the ActorSystem
  val actorSystem=ActorSystem("UniversityMessageSystem")

  //construct the Teacher Actor Ref
  val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])

  //send a message to the Teacher Actor
  teacherActorRef!QuoteRequest

  //Let's wait for a couple of seconds before we shut down the system
  Thread.sleep (2000) 

  //Shut down the ActorSystem.
  actorSystem.shutdown()

}

不过,我确实撒了一个小慌。你需要shutdown ActorSystem或者让JVM一直跑。我给这个main线程sleep一下只是为了给TeacherActor一点时间来完成它的任务。我知道这听起来有点傻。别担心这个。我们后面会写一些测试用例来避免这个。

这是我翻译的文章,原文在http://rerun.me/2014/09/19/akka-notes-actor-messaging-1/



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

时间: 2024-07-31 05:07:25

翻译:AKKA笔记 - Actor消息 -1(一)的相关文章

[翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者postRestart方法,当我们讨论supervision时候我们会说这个) 基本的Actor生命周期很直观.除了一点小不同,你可以直接拿基本Actor生命周期与Java Servlet生命周期作比较. 像其他常规类一样,我们有一个构造函数. preStart方法会被调用. 这里你可以在postStop

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

原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Actor的child. 让我们分析下: PATH 我们用ActorSystem.actorof创建一个ActorRef并打印出他的path val actorSystem=ActorSystem("SupervisionActorSystem") val actorRef=actorSyste

[翻译]AKKA笔记 - DEATHWATCH -7

当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和gracefulstop). 无论Actor是怎么死的,有些情况一些系统中的其他actor想要知道.让我们举一个Actor与数据库交互的例子 - 我们叫它RepositoryActor.很明显,会有一些其他actor会向这个RepositoryActor发送消息.这些有"兴趣"的Actor很

翻译:AKKA笔记 - 介绍Actors

任何以前做过多线程的人都不会否认管理多线程程序是困难并且痛苦的. 我说管理是因为它开始很容易而且当你看到性能提升时会很兴奋.但是,当你看到你没法从子线程的错误中恢复 或者 这些僵尸bug很难重现 或者 当用性能剖析器时你发现你的线程在更新一个共享状态时阻塞了很长时间时,那真的很痛苦. 我倾向于不说Java的并发API和集合把并发编程变的更轻松和容易了,因为如果你看到这,你肯定渴望对子线程任务有更多控制或者希望更简单但又不愿意去写一堆的锁和同步代码块,而且希望对这种模式有更高层的抽象. 着这个Ak

Akka笔记之Actor简介

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 写过多线程的人都不会否认,多线程应用的维护是件多么困难和痛苦的事.我说的是维护,这是因为开始的时候还很简单,一旦你看到性能得到提升就会欢呼雀跃.然而,当你发现很难从子任务的错误中恢复或者有些僵尸BUG很难复现再或者你的分析器显示你的线程在写入一个共享状态前大部分时间都浪费在阻塞上面的时候,痛苦降临了. 我刻意没提Java的并发API,以及它里面的集合类使得多线程编程变得多么轻松简单,因为我相信既然你们点进了这篇文章,

Akka笔记之消息传递

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 在Akka笔记第一篇的介绍中,我们大致介绍了下Akka工具箱中的Actor.在第二篇当中,我们来看一下Actor消息传递的功能.这里还是延用之前使用的那个学生-老师的例子. 在Actor消息的第一部分中,我们会创建一个老师的Actor,但学生Actor则先不创建,而是使用一个叫做StudentSimulatorApp的主程序. 仔细回顾下学生-老师模型 我们现在只考虑StudentSimulatorApp发送给Tea

Akka笔记之日志及测试

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 在前两篇笔记中(第一篇,第二篇),我们简单地介绍了一下Actor以及它的消息传递是如何工作的.在本篇中,我们将看下如何解决TeacherActor的日志打印及测试的问题. 简单回顾 前面我们的Actor是这样的: class TeacherActor extends Actor { val quotes = List( "Moderation is for cowards", "Anything

Akka笔记之请求与响应

英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 前面我们讲到了Actor的消息传递,并看到了如何发送一条fire-n-forget消息(也就是说,消息发送给Actor后我们就不管了,不从Actor那接收响应). 技术上来讲,消息发送给Actor就是希望能有副作用的.设计上便是如此.目标Actor可以不做响应,也可以做如下两件事情-- 1. 给发送方回复一条响应(在本例中,TeacherActor会将一句名言回复给StudentActor) 2. 将响应转发给其它的

ViewState 剖析(翻译兼笔记)

笔记 ViewState 不是什么? 1. ViewState 不是用来恢复回发的控件的值.这个是通过匹配 form 中该控件的变量名而自动完成的.这个只对 Load 事件加载之前创建的控件有效.2. ViewState 不会自动重新创建任何通过代码动态创建的控件.3. 不是用来保存用户信息的.仅仅保存本页的控件状态,而不能在页面之间传递. ViewState 是什么? ViewState 用来跟踪和保存控件的状态信息.否则这些信息可能会丢失,原因可能是这些值不随着 form 回发,或者根本就不