Akka 编程(14): Become/Unbecome

Akka支持Actor消息循环处理部分的热切换,调用context.become方法可以使用新的消息循环处理替换当前的消息处理器,被替换的消息处理器被压到一个栈结构,支持消息处理器的出栈和入栈。
注:但Actor重启时,它的消息循环处理恢复到初始的行为。
become方法的参数类型为部分函数PartialFunction[Any, Unit],例如:

1 import akka.actor.Actor
2 import akka.actor.ActorSystem
3 import akka.actor.Props
4  
5 class HotSwapActor extends Actor {
6         import context._
7         def angry: Receive = {
8                 case "foo" => sender() ! "I am already angry?"
9                 case "bar" => become(happy)
10         }
11         def happy: Receive = {
12                 case "bar" => sender() ! "I am already happy :-)"
13                 case "foo" => become(angry)
14         }
15         def receive = {
16                 case "foo" => become(angry)
17                 case "bar" => become(happy)
18         }
19 }

这种become的用法可以用来实现有效状态机(FSM),它总是替换当前的Actor行为,而不是用unbecome(退栈操作)。
另外一种用法,不是替换,而是添加到行为栈的顶部,这种情况需要当心的是,退栈(unbecome)和入栈(become)操作需要匹配,否则会造成内存泄漏。

1 case object Swap
2 class Swapper extends Actor {
3     import context._
4     def receive = {
5         case Swap =>
6             println("Hi")
7             become({
8                 case Swap =>
9                     println("Ho")
10                     unbecome() // resets the latest ’become’ (just for fun)
11             }, discardOld = false// push on top instead of replace
12     }
13 }
14 object SwapperApp extends App {
15     val system = ActorSystem("SwapperSystem")
16     val swap = system.actorOf(Props[Swapper], name = "swapper")
17     swap ! Swap // print Hi
18     swap ! Swap // print Ho
19     swap ! Swap // print Hi
20     swap ! Swap // print Ho
21     swap ! Swap // print Hi
22     swap ! Swap // print Ho
23 }

更多内容请访问www.imobilebbs.com

Akka 编程(14): Become/Unbecome

时间: 2024-07-28 13:00:43

Akka 编程(14): Become/Unbecome的相关文章

Java Swing界面编程(14)---JTabbedPane

package com.beyole.util; import java.awt.Container; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; public class test13 { public static void main(String[] ar

Akka 编程: 什么是Actor

上一篇我们简单介绍了Actor系统,说明了Actor之间存在着层次关系,它也是构成Actor应用的最基本的单位.本篇介绍Actor本身的一些基本概念.一个Actor包含了State(状态),Behavior(行为),一个Mailbox(邮箱)和Supervisor Strategy (管理员策略),所有这些都封装在一个Actor引用之中(Actor Reference).Actor 引用一个Actor对象需要和外界隔离开来才能构成一个Actor模型,因此从外部看,一个Actor对象由一个Acto

并发编程 14—— 线程池 之 原理一

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

Akka 编程(20):容错处理(一)

我们在前面介绍Actor系统时说过每个Actor都是其子Actor的管理员,并且每个Actor定义了发生错误时的管理策略,策略一旦定义好,之后不能修改,就像是Actor系统不可分割的一部分.实用错误处理首先我们来看一个例子来显示一种处理数据存储错误的情况,这是现实中一个应用可能出现的典型错误.当然实际的应用可能针对数据源不存在时有不同的处理,这里我们使用重新连接的处理方法.下面是例子的源码,比较长,需要仔细阅读,最好是实际运行,参考日志来理解: 1 import akka.actor._ 2 i

[C++11 并发编程] 14 关联任务与期望

std::packaged_task<>将期望绑定到一个函数或者可调用对象.当std::packaged_task<>对象被触发时,它将调用关联的函数和可调用对象使得期望被满足,并将返回值填入期望关联的数据之中.这个可以用于构建线程池,也可以用于任务管理(每个任务在各自的线程中执行或所有任务顺序的在一个后台线程中执行).如果一个大的操作可以被拆分为多个子任务,每个子任务就可以被放入一个std::packaged_task<>实例之中,再将这个实例交给任务调度器或者线程池

Delphi多线程编程(14)--多线程同步之WaitableTimer(等待定时器对象)

转载自:万一的博客 function CreateWaitableTimer( lpTimerAttributes: PSecurityAttributes; //安全 bManualReset: BOOL; //True:可调度多个线程:False:只调度一个线程 lpTimerName: PWideChar //名称 ):THandle; stdcall; //返回句柄 function SetWaitableTimer( hTime: THandle; //句柄 var lpDueTime

Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)

一. 概述 linux安全系统的核心是用户账户. 创建用户时会分配用户ID(UID). UID是唯一的,但在登录系统时不是用UID,而是用登录名.在讲文件权限之之前,先了解下linux是怎样处理用户账户的.以及用户账户需要的文件和工具,这样处理文件权限问题时,就知道如何使用它们了. 1.1  /etc/passwd用户文件 /etc/passwd 是用来将用户的登录名,匹配到对应的UID上.它包含了一些与用户有关的信息.下面截取二个片断.如下图所示: root用户账户是linux系统管理员,固定

Linux之Shell编程(14)

条件判断: [ condition ],condition前后都有空格 常用的判断条件: 1)两个整数的比较 = 字符串比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 2)按照文件权限进行判断 -r有读的权限 -w有写的权限 -x有执行的权限 3)按照文件类型进行判断 -r文件存在并且时一个常规文件 -e文件存在 -d文件存在并是一个目录 if判断: if [ condition ];then 程序 fi 或者 if [ condition1

Scala-Unit7-Scala并发编程模型AKKA

一.Akka简介 Akka时spark的底层通信框架,Hadoop的底层通信框架时rpc. 并发的程序编写很难,但是Akka解决了spark的这个问题. Akka构建在JVM平台上,是一种高并发.分布式.并且容错的应用工具包: Akka使用Scala语言编写,同时它提供了Scala和Java的开发接口,Akka可以开发一些高并发的程序. 二.Akka的Acor模型 A卡卡处理并发的方法基于actor模型,在基于actor的系统中,所有事物都是actor(类似于Java的万物皆对象): actor