Actor生命周期理解
来源:互联网 发布:java缓存技术 redis 编辑:程序博客网 时间:2024/06/06 09:34
Actor生命周期理解
镇图:Actor内功心法图
Actor的生命周期可以用Hooks体现和控制,下面是默认的Actor Hooks的方法,我们可以选择性的进行重写:
def preStart(): Unit = ()def postStop(): Unit = ()def preRestart(reason: Throwable, message: Option[Any]): Unit = { context.children foreach { child ⇒ context.unwatch(child) context.stop(child) } postStop()}def postRestart(reason: Throwable): Unit = { preStart()}
每个Hooks,在不同的策略下调用次数及顺序是不同的,那什么是策略?:
class DbSupervisor extends Actor { override def supervisorStrategy = OneForOneStrategy() { //如果dbWriter失败,则调用Restart策略,重启该出错的Actor case _: DbBrokenConnectionException => Restart }
策略,比如Restart,实际上就是执行了一系列的方法包括:preRestart,postRestart
Start策略
Start策略,调用preStart Hook,一般用于初始化资源.在创建一个Actor的时候,会调用构造函数,之后调用preStart,那这两个方法有什么区别呢,资源初始化是放在构造函数,还是放在preStart里面呢?在Restart策略里面会详细介绍。
Stop策略
postStop hook 一般用于回收资源。Actor在被调用postStop之前,会将邮箱中剩下的message处理掉(新的消息变成死信了)。Actor是由UID和Path来唯一标识的,也就是说ActorRef也是通过UID和Path来定位。在Actor被Stop之后,新的Actor是可以用这个Path的,但是旧的ActorRef是不能用的,因为UID不一样。
Restart策略
Restart策略是最为复杂的一种情况,先上个图:
在默认情况下,Restart策略会:
- actor被挂起
- 调用旧实例的 supervisionStrategy.handleSupervisorFailing 方法 (缺省实现为挂起所有的子actor)
- 调用preRestart方法,从上面的源码可以看出来,preRestart方法将所有的children Stop掉了!(Stop动作,大家注意!),并调用postStop回收资源
- 调用旧实例的 supervisionStrategy.handleSupervisorRestarted 方法 (缺省实现为向所有剩下的子actor发送重启请求)
- 等待所有子actor终止直到 preRestart 最终结束
- 再次调用之前提供的actor工厂创建新的actor实例
- 对新实例调用 postRestart
- 恢复运行新的actor
Restart策略,和Stop策略有什么不同的地方?
Stop策略会调用postStop(),Restart策略也会调用postStop(),但是Restart策略不是通过Stop策略来停止旧的Actor,UID和Path都没变。也就是说,在被Restart之后,不用重新获取ActorRef.
preRestart Hook有什么特别之处?
默认的preRestart Hook会将所有的Children通过Stop策略停止,这个时候Children就是通过Stop策略->Start策略启动的,而不是被递归Restart.那有什么影响?如果有外部的Actor持有旧的Chidren ActorRef,那这个Ref就是不能用的,因为虽然Path是对的,但是UID已经变了!
postRestart Hook有什么特别之处?
默认postRestart是调用preStart(),这样在重启的过程中,构造函数和preStart方法都会被重新调用,如果有个资源只想初始化一次,那么就必须重写掉这个方法
.所以一般创建children是放在preStart里面。
override def preStart(): Unit = { // 初始化children}// 重写postRestart防止preStart每次重启都被调用override def postRestart(reason: Throwable): Unit = ()override def preRestart(reason: Throwable, message: Option[Any]): Unit = { // 任然要清理自己,但是不Stop children postStop()}
被重启后,如何继承旧的actor的状态?
通过将state转储到:
- 数据库(案例:Hbase,也是郑草原的实时计算集群采用的持久化方法)
- 官方的包akka-persistence-experimental(测试阶段), ppt介绍 and Persistence文档
- 非JVM级别的crash,使用静态类保存状态
- Actor生命周期理解
- Actor生命周期理解
- [akka] Actor的生命周期
- Actor的生命周期图
- Unreal的Actor的生命周期
- akka actor理解
- akka基础 : 理解Actor 系统
- 十分钟理解Actor模式
- Akka学习笔记04--Actor生命周期
- Akka学习笔记04--Actor生命周期
- [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5
- akka学习教程(四) actor生命周期
- Akka(2):Actor生命周期管理
- Actor
- Actor
- Actor
- Actor
- 对于akka中,actor模型的理解。
- Android_gps
- 个人曾经觉得挺好的开发案例
- Merge Sort
- wordpress中不使用插件添加文章浏览数及评论数的方法。
- VST SDK 3.x 开发(一):VST结构介绍
- Actor生命周期理解
- spring mvc 一个controlller对应多个请求 其中包含 不同请求对应不同目录下的不同视图
- 在Java中,获得ResultSet的总行数的方法
- HDU1232畅通工程
- centos6.5部署openldap信息存储主机快速登录
- Can't locate Switch.pm in @INC 的解决办法
- Java RandomAccessFile用法
- XML语法规则
- 开发:异常收集之 expected single matching bean but found 2