Akka 的Actor
从第一篇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一点时间来完成它的任务。我知道这听起来有点傻。别担心这个。我们后面会写一些测试用例来避免这个。
Akka 的Actor的更多相关文章
- 二 Akka学习 - actor介绍
一个actorSystem 是一个重量级的结构.它会分配N个线程.所以对于每一个应用来说只用创建一个ActorSystem. Actor是种可怜的“生物”,它们不能独自存活.Akka中的每一个Acto ...
- [翻译]AKKA笔记 -ACTOR SUPERVISION - 8
失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...
- [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3
上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...
- 翻译:AKKA笔记 - Actor消息 -1(二)
消息 我们只是让QuoteRequest到ActorRef去但是我们根本没见过消息类! 它是这样的: (一个最佳实践是把你的消息类包装在一个完整的对象里以利于更好的组织) TeacherProtoco ...
- 翻译:AKKA笔记 - Actor消息 -1(一)
从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors.在这篇笔记的第二篇,我们会看一下Actors中的消息部分.而且延续上一次的例子,我们还会使用同样的学生与老师的例子 ...
- Akka的Actor模型及使用实例
本文的绝大部分内容转载自rerun.me这一blog,老外写的东西就是好啊. ACTORS介绍 Anyone who has done multithreading in the past won't ...
- akka创建actor时报错:IllegalArgumentException: no matching constructor found on class $iwC$$iwC$$iwC$$iwC$
在spark-shell中输入范例中的代码: import akka.actor.Actor import akka.actor.Props import akka.event.Logging cla ...
- 三 akka学习 actor的例子
(转载: http://blog.csdn.net/chenleixing/article/details/44044243 ) Java并发编程的4种风格:Threads,Executors,For ...
随机推荐
- 使用JavaScript循环嵌套解决各种图形
[循环嵌套的规律] 1.外层循环控制行数,内层循环控制每行中元素的个数. [图形题思路] 1.确定图形有几行,行数即为外层循环次数: 2.确定每行中有几种元素组成,有几种元素表示有几 ...
- 整个IT界可分为13块大领域
IT界可以划分为13个领域 Location: NanJing
- 【Alpha阶段】第二次scrum meeting
每日任务: ·1.本次会议为第二次Meeting会议: ·2.本次会议于今日上午08:30第五社区五号楼下召开,会议时长15min. 一.今日站立式会议照片: 二.每个人的工作: 三.工作中遇到的困难 ...
- 线程高级篇-Lock锁和Condition条件
浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其 ...
- 201521123085 《Java程序设计》 第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- java第二次实验
1. 本章学习总结 答:学会在java中使用函数调用. 学会在Java程序中使用函数,使程序层次更清晰. 使用StringBuilder代替string拼接,减少内存空间的占用. 使用BigDecim ...
- Python笔记2.1
所有类型如下图: 一 基础数据类型 1)数字类型 复制代码 >>> 2/2+2*2 5.0 >>> (50-5*6)/4 5.0 >>> 8/5 ...
- 201521123042 《Java程序设计》第12周学习总结
本次作业参考文件 正则表达式参考资料 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String ...
- sql+PHP基础+面向对象基础简单总结
一.MYSQL 1.配置MySql 第一步安装服务器(apache). 第二部安装MySql界面程序 2 ...
- Mysql中的in和find_in_set的区别?
在mysql中in的使用情况如下: select * from article where 列名 in(值1,值2,值3.....): select * from article where 值1 i ...