在上一部分,我们已经介绍了actor的基本用法,知道如何创建一个actor。我相信大家肯定不想局限于如此,一定想把actor紧紧的握在手中,掌握它的生死。come on ,来吧!
Actor生命周期
线程在运行历程中,会经历创建、准备、等待、阻塞等阶段,这一系列我们称之为生命周期。当然,actor也有它自己的生命历程,比如创建、运行、重启和销毁等。在理想的情况下,Actor会任劳任怨的不停工作,但在实际情况下,网络超时或者程序异常,我们希望能够及时感知并处理,例如actor重启或停止执行。关于Actor的生命周期,我们先来看一张图(来自Akka官网):
从图中,我们看出Actor的生命周期主要包含创建并启动(Start)、恢复(Resume)、重启(Restart)、停止(Stop)这几个阶段,针对自身状态变化,各阶段主要有如下行为:
阶段 |
行为 |
创建并启动 (Start) |
actorOf()创建并启动Actor时,指定对象Path和UID(对象唯一标识,通过getSelf().path().uid()获取),默认执行preStart()方法,我们可以在该方法中进行资源初始化。 |
恢复 (Resume) |
actor出现异常时,在容错机制下,可以让actor恢复并继续执行,此时actor会继续使用之前的对象实例,状态也回保留。 |
重启 (Restart) |
重启会经历两个过程: 1.调用旧实例的preRestart()方法,该方法会默认停掉所有子级actor并调用postStop()方法。 2.创建新实例,在新实例上调用postRestart()方法, 该方法默认会调用preStart()方法。 重启之后,path和UID不变,ActorRef不变,但是自身状态已改变。< |