(〇)介绍

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

要停止一个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时的行为。

(一)创建maven工程并添加依赖。

(二)编写代码

import akka.actor.AbstractActor;
import akka.actor.AbstractActor.Receive;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;class StartStopActor1 extends AbstractActor {static Props props() {return Props.create(StartStopActor1.class, StartStopActor1::new);}@Overridepublic void preStart() {System.out.println("first started");getContext().actorOf(StartStopActor2.props(), "second");}@Overridepublic void postStop() {System.out.println("first stopped");}@Overridepublic Receive createReceive() {return receiveBuilder().matchEquals("stop",s -> {getContext().stop(getSelf());}).build();}
}class StartStopActor2 extends AbstractActor {static Props props() {return Props.create(StartStopActor2.class, StartStopActor2::new);}@Overridepublic void preStart() {System.out.println("second started");}@Overridepublic void postStop() {System.out.println("second stopped");}// Actor.emptyBehavior is a useful placeholder when we don't// want to handle any messages in the actor.@Overridepublic Receive createReceive() {return receiveBuilder().build();}
}
public class ActorHierarchyExperiments {public static void main(String[] args) throws java.io.IOException {ActorSystem system = ActorSystem.create("testSystem");ActorRef first = system.actorOf(StartStopActor1.props(), "first");first.tell("stop", ActorRef.noSender());}
}

(三)运行

(四)分析

当我们停止Actor first 时,它停止了它的子Actor  second,然后停下来。这种排序是严格的,在调用父项的postStop之前调用子项的所有 postStop()。

也就是说所有的子Actor都在父Acor结束之前结束。

Akka的Hello World(二)Akka的Actor生命周期相关推荐

  1. Akka的Actor生命周期《Eight》译

    Actor在创建时出现,然后在用户请求时停止.每当一个Actor停止时,它的所有孩子也会被递归停止.此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开的套接字和文件引起的资源泄漏.事实上,处 ...

  2. 【Akka】Akka Actor生命周期

    1.概述 转载:Akka Actor生命周期 用于自我学习. Actor的生命周期是使用Hooks体现和控制的,我们可以重写相关的Hooks,从而实现对Actor生命周期各环节的细粒度控制.各事件发生 ...

  3. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. Actor生命周期理解

    Actor生命周期理解 镇图:Actor内功心法图 Actor的生命周期可以用Hooks体现和控制,下面是默认的Actor Hooks的方法,我们可以选择性的进行重写: def preStart(): ...

  5. Eolink神技之二、API全生命周期管理

    Eolink神技之二.API全生命周期管理 目录 Eolink神技之二.API全生命周期管理 Eolink全API全生命周期管理解决的问题 演示过程 一.创建项目文档 1.1.创建项目 1.2.项目管 ...

  6. UE4 Actor生命周期 SpawnActor DestroyActor剖析

    原创文章,转载请注明出处. AActor很重要,只要是我们世界大纲列表内的物体,全部都是AActor. 目录 第一部分,从编辑器点击Play开始分析World里面全部的Actor的Spawn流程,分析 ...

  7. Android实验二:Activity的生命周期

    要求 设计如下界面,包括四个按钮,两个文本框.单击对应按钮可以启动对应activity.假 定Activity A为启动Activity. 部分代码 import androidx.appcompat ...

  8. Android开发笔记(四十二)Broadcast的生命周期

    Broadcast是什么 广播的特性 广播(Broadcast)用于Android组件之间的灵活通信,它与Activity和Service的区别在于: 1.Activity和Service都只能一对一 ...

  9. UE5——Actor生命周期——销毁

    Actor类 判断对象是否被标记为销毁状态 LevelActor类 意思是不允许从客户端删除Actor 准备销毁Actor 销毁 通知蓝图 通知网络驱动动Actor已经被销毁了 从关卡列表中移除掉 通 ...

最新文章

  1. Java Coverage(Cobertura)工具
  2. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
  3. 同步电路设计的一些问题(时序分析基础,同步电路设计规则)
  4. 【C 语言】字符串拷贝 ( 指针使用前判空 | while 空语句 )
  5. SOCKET聊天室字符界面版
  6. 【Vue.js 知识量化】Vuex 详解
  7. “数”有专攻、智“汇”武汉,周末技术沙龙Call你来!
  8. linux 系统命令启动,Linux开关机及系统进程命令
  9. TensorFlow中的Shape如何理解
  10. 使用分身术变身术创建新进程
  11. 谜底是计算机病毒的谜语,有关于安全的谜语及谜底答案解析|谜底是粽子的谜语...
  12. Ocata Neutron代码分析(一)——Neutron API启动过程分析
  13. 永久60服务器消息,魔兽世界怀旧服:永久60级已经成为了另一个游戏,这如你所愿吗?...
  14. android 滚动手势动画
  15. hexo搭建github.io博客
  16. 计算机游戏设计师要学什么,浅析游戏设计师必须学习编程的理由
  17. 网站流量统计工具介绍
  18. SQL 数据操纵语言
  19. All In One - 第3章 安全工程
  20. 魔幻滤镜Gabor Filter 原理与实现(python C++)

热门文章

  1. opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)
  2. python如何删除文件夹下文件和文件夹?
  3. 各家版本控制系统(VCS)对比:VSS、SVN、Git。代码托管平台对比:GitLab、GitHub、码云(Gitee)、SourceForge、DevCloud(华为软件开发云)
  4. Python numpy hstack() vstack() stack() dstack() vsplit() concatenate()函数用法和区别
  5. java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...
  6. 哈希算法python_哈希算法(Python代码实现)
  7. java抽象类到底能不能够实例化?
  8. SpringMVC学习(二)——快速搭建SpringMVC开发环境(注解方式)
  9. nginx启动成功,解决别的电脑访问不了页面的问题
  10. Jenkins转换成中文(Jenkins汉化)