[转] https://blog.csdn.net/wsscy2004/article/details/38875065

镇图: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策略会:

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
8. 恢复运行新的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生命周期理解的更多相关文章

  1. Akka(2):Actor生命周期管理 - 监控和监视

    在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式.对比起我们习惯的行令式(imperative)编程模式,Actor编程模式更接近现实中的应用场景和功能测试模式 ...

  2. [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

    原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...

  3. JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期

    JSP 生命周期 理解JSP底层功能的关键就是去理解它们所遵守的生命周期. JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成ser ...

  4. Akka之Actor生命周期

    我们首先来看一下官方给出的Actor的声明周期的图: 在上图中,Actor系统中的路径代表一个地方,其可能会被活着的Actor占据.最初路径都是空的.在调用actorOf()时,将会为指定的路径分配根 ...

  5. akka-typed(1) - actor生命周期管理

    akka-typed的actor从创建.启用.状态转换.停用.监视等生命周期管理方式和akka-classic还是有一定的不同之处.这篇我们就介绍一下akka-typed的actor生命周期管理. 每 ...

  6. activity学习(1) 生命周期理解

    可以忽略onWindowFocusChanged.onSaveInstanceState.onRestoreInstanceState几个事件,这几个事件官网中的生命周期里面没有提到.忽略掉这几个方法 ...

  7. maven生命周期理解

    你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点.当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期. 知道了每套生命周期的大概用途和相互关系 ...

  8. Maven的构建生命周期理解

    以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...

  9. Activity生命周期理解

    在Android应用程序运行时,Activity的活动状态由Android以Activity栈的形式管理,当前活动的Activity位于栈顶.随着应用程序之间的切换.关闭等,每个Activity都有可 ...

随机推荐

  1. BASE64Encoder及BASE64Decoder编译器找不到问题

    编译器自带这两个类,但是会报错找不到,需要手动让编译器识别这个类 第一步.右键项目,然后选择properties 第二步,打开如图位置 第三部,选择如图位置,双击 第四部,add添加 更改值 改为如图 ...

  2. UVa 1395 Slim Span (最小生成树)

    题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...

  3. Shell 常用命令总结

      Shell常用命令总结 1  ls命令:列出文件 ls -la 列出当前目录下的所有文件和文件夹 ls a* 列出当前目录下所有以a字母开头的文件 ls -l *.txt 列出当前目录下所有后缀名 ...

  4. 大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

    第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式 ...

  5. xib下这种方式创建cell

      这种方法在iOS5.0之前是不能够创建成功的.   MEConvertListTableViewCell *cell = [tableView dequeueReusableCellWithIde ...

  6. Hello_Motion_Tracking 任务一:Project Tango采集运动追踪数据

    我们来看一下中的几个基本的例子 (区域描述.深度感知.运动追踪.视频4个) 参考:Google Tango初学者教程 1. hello_motion_tracking package com.proj ...

  7. 团体程序设计天梯赛L2-024 部落 2017-04-18 11:31 274人阅读 评论(0) 收藏

    L2-024. 部落 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不 ...

  8. LRUCache c#

    LRUCache是Least Recently Used 近期最少使用算法的缓存,是android提供的一个缓存工具类.可以以两种排序方式来输出缓存,一种是按插入顺序输出,一种是按最近最少方式输出,最 ...

  9. 经典的兔子生兔子问题(C#递归解法)

    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 思路:先求出每个月新增的兔子,再用循环求和即可算出这个月 ...

  10. squid代理缓存服务

    man.linuxde.net 1.squid是Linux系统中的代理缓存服务,通常用作WEB网站的前置缓存服务,能够代替用户向网站服务器请求页面数据并进行缓存. 2.squid服务特点:配置简单.效 ...