Actor在建立时出现,而后在用户请求时中止。每当一个Actor中止时,它的全部孩子也会被递归中止。此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开的套接字和文件引发的资源泄漏。事实上,处理低级多线程代码时经常被忽视的困难是各类并发资源的生命周期管理。html
要中止一个Actor,推荐的模式是在Actor内部调用getContext().stop(getSelf())来自行中止,一般做为对某些用户定义的中止消息的响应,或者当Actor完成其做业时。经过调用getContext().stop(actorRef)技术上能够阻止另外一个Actor,可是以这种方式阻止任意Actor是一种很差的作法:尝试向它们发送PoisonPill或自定义中止消息。多线程
Akka Actor API公开了许多能够在Actor实现中覆盖的生命周期方法,最经常使用的是preStart()和postStop()。并发
让咱们在一个简单的实验中使用preStart()和postStop()生命周期方法来观察中止Actor时的行为。首先,将如下2个Actor类添加到项目中:ide
并建立一个像上面这样的“main”方法来启动,而后向他们发送一个“中止”消息:post
您能够再次使用sbt来启动此程序。输出应以下所示:测试
当咱们首先中止Actor时,它中止了它的子Actor,第二,在中止以前。这种排序是严格的,在调用父级的postStop()以前调用子级的全部postStop()。ui
Akka参考手册的Actor生命周期( Actor Lifecycle )部分提供了关于全生命周期的详细信息。spa
父和子在整个生命周期中都是相互联系的。每当Actor失败(抛出一个异常或未处理的异常从接收中冒出来)时,它就会被暂时挂起。如前所述,失败信息被传播到父进程,而后由父进程决定如何处理由子Actor引发的异常。在这种状况下,父充当子的监督者。默认的监督策略是中止并从新启动子进程。若是不更改默认策略,则全部失败都会致使从新启动。线程
让咱们在一个简单的实验中观察默认策略。将如下类添加到项目中,就像以前的类同样:3d
并运行:
输出:
咱们看到失败后,受监督的Actor被中止并当即从新启动。咱们还看到一个日志条目,报告处理的异常,在本例中是咱们的测试异常。在这个例子中,咱们使用preStart()和postStop(),它们是在重启以后和以前调用的默认值,所以咱们没法区分actor内部是第一次启动仍是从新启动。这一般是正确的作法,从新启动的目的是将actor设置为已知良好状态,这一般意味着一个干净的起始阶段。实际发生的是调用了preRestart()和postRestart()方法,若是没有被覆盖,默认状况下分别委托给postStop()和preStart()。您能够尝试覆盖这些其余方法,并查看输出如何更改。
对于感兴趣的人,咱们还建议您查看监督参考页面(supervision reference page )以得到更深刻的详细信息。
咱们已经了解了Akka如何在层级中管理Actor,父Actor监督孩子Actor并处理异常。咱们看到了如何建立一个很是简单的Actor和孩子Actor。接下来,咱们将经过建模从设备Actor获取信息所需的通讯来将这些知识应用于咱们的示例用例。稍后,咱们将讨论如何管理团队中的Actor。
原文:https://doc.akka.io/docs/akka/current/guide/tutorial.html
有什么讨论的内容,能够加我公众号: