Akka学习笔记07--TypedActor(有类型的Actor)
来源:互联网 发布:网络信息发布规范 编辑:程序博客网 时间:2024/05/18 23:57
Akka 中的有类型 Actor 是 Active Objects 模式的一种实现,将异步的调用执行逻辑封装在一个方法内,在代码层面保证了的顺序执行思维。
Active Objects 设计模式
来自维基百科 Active Objects 。
该设计模式包含了六种元素:
- 代理:提供了面向客户端的带有公开方法的接口。
- 接口:定义了到 active object 的请求方法(业务代码提供)。
- 来自客户端的一序列等待请求。
- 调度器:决定接下来执行哪个请求。
- active object 方法的实现类(业务代码提供)。
- 一个回调或变量,用以让客户端接收结果。
上述六个元素中,除了标记(业务代码提供)的,其余都是由该模式的实现提供的,在本篇也就是 Akka。
Akka 是通过 JDK 的 java.lang.reflect.Proxy 来自实现 active object 模式的。
使用 TypedActor
TypedActor 将消息传递隐藏在方法调用内,但它也必须满足 Actor 顺序地、独占地执行 Actor 代码逻辑的要求。
有类型Actor相对于普通Actor的优势在于有类型Actor拥有静态的契约,你不需要定义你自己的消息,它的劣势在于对你能做什么和不能做什么进行了一些限制,i.e. 你不能使用 become/unbecome。
1. 定义业务接口和实现
<pre name="code" class="ruby">import scala.concurrent.Future/** * Created by Administrator on 15-2-25. */trait Square { //长宽各增加1 def add(x: Int, y: Int):Unit // 面积 def area: Future[Int]}class CalculateSquare(var length: Int, var width: Int) extends Square { def add(x: Int, y: Int):Unit = { this.length += 1 this.width += 1 } def area: Future[Int] = { println("wait before area") Thread.sleep(2000) Future.successful(length * width) }}
2. 封装成 active object 非常简单
val square = TypedActor(system).typedActorOf(TypedProps(classOf[Square],newSquareImpl(10,20)),"name")
3. 测试 TypedActor 的执行效果
<pre name="code" class="ruby">import akka.actor._import scala.concurrent.duration._import scala.concurrent.Await/** * Created by Administrator on 15-2-25. */object LearnTypedActor { def main(vars: Array[String]) { val system = ActorSystem("myActorSystem") val calculator:Square = TypedActor(system).typedActorOf(TypedProps(classOf[Square], new CalculateSquare(10, 20))) //Send and receive,类似ask val future01 = calculator.area val result01 = Await.result(future01, 5 second) println(result01) //Fire and forget, 类似tell calculator.add(1,2) val future02 = calculator.area val result02 = Await.result(future02, 5 second) println(result02) system.shutdown() }}
这里定义了一个 SenderActor 是为了并发地调用 TypedActor 实现的方法。由于 area
方法的实现里进行了等待,circumference
没有,如果 TypedActor 不是顺序地处理消息,那么circumference
应该比area
先执行,否则是后执行。
4. 结果
<pre name="code" class="ruby">wait before area200wait before area231
结果是符合预期的,先调用的 area
方法虽然进行了等待,但后调用的circumference
还是得等area
方法执行完后才能执行。
TypedActor 的优势
如果我们通过消息传递的方式来调用,就需要编写代码的人具有异步的思维,异步地思考,而人的思维模式都是顺序地思考的,这就需要很大的转变。
TypedActor 保持了消息传递的优点,且 Akka 框架屏蔽了异步性,允许程序员继续用顺序的思维思考问题。
另一个优势就是它是有类型的,由于消息传递被封装在方法调用内,所以传递的消息都有了类型安全的保障,直接使用 Actor,可能会收到任意类型的消息。
Tips:转载于http://coderbee.net/index.php/akka/20140825/1031
- Akka学习笔记07--TypedActor(有类型的Actor)
- Akka学习笔记07--TypedActor(有类型的Actor)
- akka入门-有类型的Actor
- Akka学习笔记05--Actor的创建
- Akka学习笔记06--Actor的消息
- Akka学习笔记05--Actor的创建
- Akka学习笔记06--Actor的消息
- Akka学习笔记(二):Actor Systems
- Akka学习笔记(三):什么是Actor
- Akka学习笔记(3)-Actor
- Akka TypedActor
- 第102讲:通过案例解析Akka中的Actor运行机制以及Actor的生命周期学习笔记
- Akka学习笔记04--Actor生命周期
- Akka学习笔记04--Actor生命周期
- Akka学习笔记:Actor消息传递(1)
- Akka学习笔记:Actor消息传递(2)
- Scala---Akka Actor(三)Actor的持久化
- [akka] Actor的生命周期
- 跨平台移动应用开发是否真的是一个好选择?
- JAVA学习笔记45——四种引用+三种HashMap+同步控制+不可变设置
- ios身份证验证
- 关于页面布局
- iOS app crash日志分析
- Akka学习笔记07--TypedActor(有类型的Actor)
- [leetcode] 10 Regular Expression Matching
- eclipse 皮肤 换肤
- 堆排序分析
- 如何访问android的asset目录和res目录下的文件
- hdu 4884 TIANKENG’s rice shop && BestCoder Round #2 1002
- Linux挂载数据盘
- HTML5用canvas绘制心形线
- git patch