Akka之Actor生命周期
我们首先来看一下官方给出的Actor的声明周期的图:
在上图中,Actor系统中的路径代表一个地方,其可能会被活着的Actor占据。最初路径都是空的。在调用actorOf()时,将会为指定的路径分配根据传入Props创建的一个Actor引用。该Actor引用是由路径和一个Uid标识的。重启时只会替换有Props定义的Actor示例,但不会替换引用,因此Uid保持不变。
当Actor停止时,其引用的生命周期结束。在这一时间点上相关的生命周期事件被调用,监视该Actor的Actor都会获得终止通知。当引用停止后,路径可以重复使用,通过actorOf()
创建一个Actor。在这种情况下,除了UID不同外,新引用与老引用是相同的。
ActorRef
始终表示引用(路径和UID)而不只是一个给定的路径。因此如果Actor停止,并且创建一个新的具有相同名称的Actor,则指向老化身的ActorRef
将不会指向新的化身。
相对地,ActorSelection
指向路径(或多个路径,如果使用了通配符),且完全不关注有没有引用占据它。因此ActorSelection
不能被监视。获取某路径下的当前化身ActorRef
是可能的,只要向该ActorSelection
发送Identify
,如果收到ActorIdentity
回应,则正确的引用就包含其中。也可以使用ActorSelection
的resolveOne
方法,它会返回一个包含匹配ActorRef
的Future
。
从上图我们可以发现Actor的生命周期主要包含三个状态:开始、终止和重启。下面分别就 这三个状态进行说明。
一、开始
其实Actor的生命周期是使用Hooks体现和控制的,我们可以重新相关的hooks,从而实现对Actor生命周期各环节的细粒度控制。而当Akka通过Props构建一个Actor后,这个Actor可以立即开始处理消息,进入开始(started)状态。Akka提供了针对开始状态的事件接口(event hooks)preStart方法,因此,我们可以重写该方法进行一些操作,例如:
override def preStart={
log.info ("Starting storage actor...")
initDB
}
二、终止
一个Actor可能因为完成运算、发生异常又或者人为通过发送Kill,PoisonPill强行终止等而进入停止(stopping)状态。而这个终止过程分为两步:
第一步:Actor将挂起对邮箱的处理,并向所有子Actor发送终止命令,然后处理来自子Actor的终止消息直到所有的子Actor都完成终止。
第二步:终止自己,调用postStop方法,清空邮箱,向DeathWatch发布Terminated
,通知其监管者。
整个人过程保证Actor系统中的子树以一种有序的方式终止,将终止命令传播到叶子结点并收集它们回送的确认消息给被终止的监管者。如果其中某个Actor没有响应(即由于处理消息用了太长时间以至于没有收到终止命令),整个过程将会被阻塞。
因此,我们可以再最后调用postStop方法,来进行一些资源清理等工作,例如:
override def postStop={
log.info ("Stopping storage actor...")
db.release
}
三、重启
重启是Actor生命周期里一个最重要的环节。在一个Actor的生命周期里可能因为多种原因发生重启(Restart)。造成一个Actor需要重启的原因可能有下面几个:
(1)在处理某特定消息时造成了系统性的异常,必须通过重启来清理系统错误
(2)内部状态毁坏,必须通过重启来重新构建状态
(3)在处理消息时无法使用到一些依赖资源,需要重启来重新配置资源
其实,Actor的重启过程也是一个递归的过程,由于其比较复杂,先上个图:
在默认情况下 ,重启过程主要分为以下几步:
(1)该Actor将被挂起
(2)调用旧实例的 supervisionStrategy.handleSupervisorFailing 方法 (缺省实现为挂起所有的子Actor)
(3)调用preRestart方法,preRestart方法将所有的children Stop掉了!(Stop动作,大家注意!),并调用postStop回收资源
(4)调用旧实例的 supervisionStrategy.handleSupervisorRestarted 方法 (缺省实现为向所有剩下的子Actor发送重启请求)
(5)等待所有子Actor终止直到 preRestart 最终结束
(6)再次调用之前提供的actor工厂创建新的actor实例
(7)对新实例调用 postRestart(默认postRestart是调用preStart方法)
(8)恢复运行新的actor
Akka之Actor生命周期的更多相关文章
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...
- Akka(2):Actor生命周期管理 - 监控和监视
在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式.对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式 ...
- akka-typed(1) - actor生命周期管理
akka-typed的actor从创建.启用.状态转换.停用.监视等生命周期管理方式和akka-classic还是有一定的不同之处.这篇我们就介绍一下akka-typed的actor生命周期管理. 每 ...
- [转] Actor生命周期理解
[转] https://blog.csdn.net/wsscy2004/article/details/38875065 镇图:Actor内功心法图 Actor的生命周期可以用Hooks体现和控制,下 ...
- Akka源码分析-Remote-网络链接生命周期
remote模式下,网络链接的生命周期往往影响着对应Actor的生命周期,那么网络链接的生命周期是怎么样的呢? 每一个与远程系统的链路都是四个状态之一:空闲.活跃.被守护.被隔离.远程系统的某个地址没 ...
- [翻译]AKKA笔记 -ACTOR SUPERVISION - 8
失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...
- 三 akka学习 actor的例子
(转载: http://blog.csdn.net/chenleixing/article/details/44044243 ) Java并发编程的4种风格:Threads,Executors,For ...
- Newbe.Claptrap 框架如何实现多级生命周期控制?
Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...
- react组件的生命周期
写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...
随机推荐
- 2190: [SDOI2008]仪仗队(欧拉函数)
2190: [SDOI2008]仪仗队 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3235 Solved: 2089 Description 作 ...
- proguaid 混淆代码
注意:这里有一个坑.就是-ignorewarnings 他老是混淆不了,告诉你不行.其实加上这句话,就可以了. 下面贴一下代码: -injars c:/ceb_lib.jar -outjars c:/ ...
- day18 js 正则,UI框架,Django helloworld 以及完整工作流程
JS正则: text 判断字符串是否符合规定的正则表达式 exec 获取匹配的数据 默认情况下: 只要能匹配到就返回true 否则返回false 只匹配数字: 所以J ...
- Less Css 教程
http://www.w3cplus.com/css/less,这个东西太吊了!
- 步骤详解安装Apache web服务器
1.在上右键è安装 安装后apache web服务器自动启动. 在右下角出现. Apache安装之后有一个默认的网站目录 在浏览器上通过网站就可以访问到该目录下的文件. 2.测试 在浏览器输上请求lo ...
- IOS开发---菜鸟学习之路--(八)-实现新闻页面
本章将具体讲述如何结合前两张的内容最终实现一个新闻页面的雏形 之所以称之为雏形,是因为本章实现的内容只是实现了最基础的效果 还有很多其他诸如下拉刷新 页面导航等效果都需要投入一些时间进行研究 好了直接 ...
- 1、IOS学习计划
2015年12月10日 -- 2015年12月27日(一共3个周末,12个个工作日) 1.斯坦福公开课(IOS7应用开发) 一共18节课程,通过视频和demo建立感觉 2.千峰的OC课程 一共25节课 ...
- 【N-Queens】cpp
题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...
- 【Luogu P2781】 传教
这题是可以用线段树做的. 虽然$n\leq 10^9$ 可以发现,真正需要用到的节点很少,故动态开点,只有需要用到的时候才新建节点. 这里我在下放标记的时候新建节点,因为每操作/查询一个节点都需要先下 ...
- 理解机器为什么可以学习(三)---Theory of Generalization
前边讨论了我们介绍了成长函数和break point,现在继续讨论m是否成长很慢,是否能够取代M. 成长函数就是二分类的排列组合的数量.break point是第一个不能shatter(覆盖所有情形) ...