文档章节

Akka的Actor生命周期《Eight》译

woshixin
 woshixin
发布于 08/21 21:37
字数 1127
阅读 5
收藏 0

    Actor在创建时出现,然后在用户请求时停止。每当一个Actor停止时,它的所有孩子也会被递归停止。此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开的套接字和文件引起的资源泄漏。事实上,处理低级多线程代码时常常被忽视的困难是各种并发资源的生命周期管理。

    要停止一个Actor,推荐的模式是在Actor内部调用getContext().stop(getSelf())来自行停止,通常作为对某些用户定义的停止消息的响应,或者当Actor完成其作业时。通过调用getContext().stop(actorRef)技术上可以阻止另一个Actor,但是以这种方式阻止任意Actor是一种不好的做法:尝试向它们发送PoisonPill或自定义停止消息。

    Akka Actor API公开了许多可以在Actor实现中覆盖的生命周期方法,最常用的是preStart()和postStop()。

  • preStart():在actor开始之后但在它处理第一条消息之前调用。
  • postStop():在actor停止之前调用。此后不会处理任何消息。

    让我们在一个简单的实验中使用preStart()和postStop()生命周期方法来观察停止Actor时的行为。首先,将以下2个Actor类添加到项目中:

    并创建一个像上面这样的“main”方法来启动,然后向他们发送一个“停止”消息:

    您可以再次使用sbt来启动此程序。输出应如下所示:

    当我们首先停止Actor时,它停止了它的子Actor,第二,在停止之前。这种排序是严格的,在调用父级的postStop()之前调用子级的所有postStop()。

    Akka参考手册的Actor生命周期( Actor Lifecycle )部分提供了关于全生命周期的详细信息。

异常处理

    父和子在整个生命周期中都是相互联系的。每当Actor失败(抛出一个异常或未处理的异常从接收中冒出来)时,它就会被暂时挂起。如前所述,失败信息被传播到父进程,然后由父进程决定如何处理由子Actor引起的异常。在这种情况下,父充当子的监督者。默认的监督策略是停止并重新启动子进程。如果不更改默认策略,则所有失败都会导致重新启动。

    让我们在一个简单的实验中观察默认策略。将以下类添加到项目中,就像之前的类一样:

    并运行:

    输出:

    我们看到失败后,受监督的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

有什么讨论的内容,可以加我公众号:

© 著作权归作者所有

共有 人打赏支持
woshixin
粉丝 22
博文 211
码字总数 186675
作品 0
杭州
程序员
Akka的Actor层级结构《seven》译

示例简介 在写散文时,最难的部分往往是编写前几句话。在开始构建Akka系统时,有一种类似的“空白画布”的感觉。你可能想知道:哪个应该是第一个Actor?它应该住在哪里?它该怎么办?幸运的是...

woshixin
08/16
0
0
Akka定义Actors和消息《two》译

Akka定义Actors和消息 消息(Messages)可以是任意类型(任何Any的子类)。您可以发送装箱的原始值(例如String, Integer, Boolean等)作为消息以及诸如数组和集合类型等普通数据结构。Case类和C...

woshixin
07/24
0
0
Akka的类库和模块《six》译

在深入研究编写Actor的一些最佳实践之前,先预览一下最常用的Akka库会很有帮助。这将帮助您开始考虑要在系统中使用的功能。所有核心Akka功能都可以作为开源软件(OSS)使用。Lightbend赞助了...

woshixin
08/07
0
0
akka入门学习指引

对我而言,对akka的了解是学习scala的过程中书籍中的Akka章节推动的,当时书中介绍说。莫明地对它挺感兴趣的,就尝试着学习一下,我是先看完了数据中的Akka章节,里面主讲了Actor模型,包含了...

high_m
2017/10/26
0
0
《Akka应用模式:分布式应用程序设计实践指南》读书笔记2

Akka简介   Akka是什么:“Akka是在JVM上构建高并发、分布式、弹性消息驱动应用的开源工具包”。弹性意味着要积极响应失败情况,从失败中恢复的能力。   其实Akka的定义很符合响应式领域...

gabrywu
06/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
0
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
129
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部