文档章节

Akka的Actor生命周期《Eight》译

woshixin
 woshixin
发布于 2018/08/21 21:37
字数 1127
阅读 10
收藏 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
粉丝 26
博文 311
码字总数 250116
作品 0
杭州
程序员
私信 提问
Akka的Actor层级结构《seven》译

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

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

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

woshixin
2018/07/24
0
0
Akka监控《eighteen》译

本章概述了监管背后的概念,并提供一些语义的说明。描述如何将其转换为实际代码的详细信息,请参阅Scala和Java API的相应章节。 示例项目:你可以看到在实践中如何使用akka-samples-supervis...

woshixin
2018/11/30
0
0
Akka中Actor介绍《seventeen》译

What is an Actor? 上一节关于Actor Systems的部分解释了actor如何形成层次结构,并且是构建应用程序时的最小单元。本节将单独查看一个这样的actor,解释在实现它时的概念。有关所有细节的更...

woshixin
2018/11/22
0
0
Akka 指南 之「第 1 部分: Actor 的体系结构」

第 1 部分: Actor 的体系结构 依赖 在你项目中添加如下依赖: 简介 使用 Akka 可以让你从为 Actor 系统创建基础设施和编写控制基本行为所需的初级()代码中解脱出来。为了理解这一点,让我们...

维C果糖
01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

c++ 定义新的异常

#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main......

天王盖地虎626
46分钟前
2
0
PDMan-2.1.1 发布:用心开源,免费的国产数据库建模工具(春节前最后一个版本)

一、软件介绍 PDMan 是一款开源免费的数据库模型建模工具,是PowerDesigner之外另一种更好的选择。支持Windows,Mac,Linux等操作系统,具有上手容易,使用简单的特点。 2018年获得码云GVP (Gi...

O龙猫O
今天
12
0
OSChina 周二乱弹 —— 以后我偷小鱼干养你

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @庞巴哥 :只有这节奏瞬间变得轻松。。。。。。。。。分享Talking Eyes的单曲《In the sun (Extended Version)》: 《In the sun (Extended Ve...

小小编辑
今天
164
6
多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
9
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部