文档章节

Akka的Actor生命周期《Eight》译

woshixin
 woshixin
发布于 08/21 21:37
字数 1127
阅读 7
收藏 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
粉丝 24
博文 238
码字总数 206905
作品 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查询设备组《fourteen》译

加入以下依赖到项目中: 介绍: 到目前为止,我们看到的会话模式很简单,因为它们要求Actor保持很少或没有状态。 特别: 设备actor返回一个读数,不需要更改状态。 记录温度,更新单个字段。...

woshixin
10/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL 索引 explain索引分析优化

EXPLAIN是MySQL提供的工具,可用于模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的,包括表的读取顺序、数据读取操作的操作类型、可能使用的索引、实际使用的索引、表之间的引...

PeakFang-BOK
4分钟前
0
0
17-《深度拆解JVM》之即时编译(上)

一、问题引入 在第一篇中,我们简单了解过即时编译。这是一项用来提升应用程序运行效率的技术。通常而言,代码会先被 Java 虚拟机解释执行,之后反复执行的热点代码则会被即时编译成为机器码...

飞鱼说编程
4分钟前
0
0
OSChina 周二乱弹 —— 请上车吧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @2amor :分享王菲的单曲《闷》 《闷》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @開源中國周杰倫 :昨天睡觉肚子疼,妈蛋,半夜爬起来...

小小编辑
53分钟前
432
9
工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
今天
8
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部