我们首先来看一下官方给出的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回应,则正确的引用就包含其中。也可以使用ActorSelectionresolveOne方法,它会返回一个包含匹配ActorRefFuture

从上图我们可以发现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生命周期的更多相关文章

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

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

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

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

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

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

  4. [转] Actor生命周期理解

    [转] https://blog.csdn.net/wsscy2004/article/details/38875065 镇图:Actor内功心法图 Actor的生命周期可以用Hooks体现和控制,下 ...

  5. Akka源码分析-Remote-网络链接生命周期

    remote模式下,网络链接的生命周期往往影响着对应Actor的生命周期,那么网络链接的生命周期是怎么样的呢? 每一个与远程系统的链路都是四个状态之一:空闲.活跃.被守护.被隔离.远程系统的某个地址没 ...

  6. [翻译]AKKA笔记 -ACTOR SUPERVISION - 8

    失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...

  7. 三 akka学习 actor的例子

    (转载: http://blog.csdn.net/chenleixing/article/details/44044243 ) Java并发编程的4种风格:Threads,Executors,For ...

  8. Newbe.Claptrap 框架如何实现多级生命周期控制?

    Newbe.Claptrap 框架如何实现多级生命周期控制?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Lifetime Scope. 特别感谢 kotone 为本文提供的校对建议 ...

  9. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

随机推荐

  1. day21&22&23:线程、进程、协程

    1.程序工作原理 进程的限制:每一个时刻只能有一个线程来工作.多进程的优点:同时利用多个cpu,能够同时进行多个操作.缺点:对内存消耗比较高当进程数多于cpu数量的时候会导致不能被调用,进程不是越多越 ...

  2. cf984c Finite or not?

    一个十进制分数 \(p/q\) 在 \(b\) 进制下是有限小数的充要条件是 \(q\) 的所有质因子都是 \(b\) 的质因子. First, if \(p\) and \(q\) are not ...

  3. cf980d Perfect Groups

    题意 定义一个串的权值是将其划分成 \(k\) 组,使得每一组在满足"从组里选出一个数,再从组里选出一个数,它们的乘积没有平方因子"这样的前提时的最小的 \(k\).每组的数不必相 ...

  4. 相当牛X的java版星际游戏

    分享一款牛人用java写的经典游戏,目录结构如下: 虽然只能算一个Demo,但是用到了很多Java基础技术和算法: Java2D,双缓冲,A星寻路,粒子系统,动画效果,处理图片,Swing ui ,U ...

  5. 移动Web应用程序开发HTML5篇

    https://software.intel.com/zh-cn/blogs/2012/03/09/webhtml5-offline-web-applications

  6. 在IE浏览器下,PDF将弹出窗口遮挡了

    写了个embed标签里面放这个pdf 然后点击其他地方的弹框pdf把他遮盖住了 如下: 先是改z-index,没卵用. 百度了好久,终于找到了个有用的 https://blog.csdn.net/it ...

  7. [python][oldboy][函数篇][1]名称空间

    名称空间:存储名字的空间,分为三种,内置空间,全局空间,局部空间 名称可以是:变量名,函数名,类名等 当遇到一个名字时,首先在自己空间找,再到自己外的空间找 比如 test.py print f # ...

  8. Vue - methods 方法

    一.methods中参数的传递 使用方法和正常的javascript传递参数的方法一样,分为两部: 1.在methods的方法中进行声明,比如我们给add方法加上一个num参数,就要写出add:fun ...

  9. HTML5 新增绘图功能

    <!DOCTYPE html> <html> <head lang="en"> <title></title> < ...

  10. 【bzoj4896】[Thu Summer Camp2016]补退选 Trie树+STL-vector

    题目描述 X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最 ...