AKKA Actor创建
Actor 类定义
Actor 类需要继承AbstractActor类
实现createReceive方法,绑定各类actor收到不同类型消息对应处理不同业务逻辑
默认提供了ReceiveBuilder类辅助创建 Receive
对actorOf的调用返回ActorRef的实例。这是 Actor 实例的句柄,也是与之交互的唯一方法。
ActorRef是不可变的,并且与它所表示的 Actor 有一对一的关系。ActorRef也是可序列化的, 序列化通过网络发送它,并在远程主机上使用它,并且它仍然在网络上表示原始节点上的同一个 Actor。
Actor的层级关系
Actor的层级关系类似树模式
谁创建谁管理原则:
ActorSystem 创建就由ActorSystem负责监控管理(重启,异常,恢复等)
Actor中创建另外的Actor,则创建者看做为父级,负责监控管理它创建出来的actor
Actor 生命周期
actorOf -> preStart -> start -> receive -> stop -> postStop
另外:
reRestart()默认行为是在重启(restarting)之前,它会终止所有的children actors(这个过程是递归的)。postRestart()则发生在重启成功之后。当然,方法都可以重写这两个方法以改变其行为。
Props
Props 创建 Actor 的配置选项,推荐在actor类提供一个通用的props方法来创建
注意:
1,同一个akka集群中创建的actor 实例 name不能重复,不然会报InvalidActorNameException异常
2,ActorSytem同一个集群,各节点的ActorSytem name必须相同
3,不允许自行new创建actor实例
如果直接new Actor实例方式创建Actor会报ActorInitializationException错误
示例:
<!-- Gradle -->
dependencies {
compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version: '2.5.21'
}
package akka.demo.actor import akka.actor.AbstractActor
import akka.actor.ActorRef import akka.actor.Props
import akka.japi.pf.ReceiveBuilder
import org.slf4j.LoggerFactory /**
** created by tankx
** 2019/9/10
**/
class HelloActor(val name: String) : AbstractActor() { //创建子actor
private val childActor: ActorRef = context.actorOf(ChildActor.props()) companion object {
private val log = LoggerFactory.getLogger(HelloActor::class.java)
//提供静态通用对外的props
fun props(name: String): Props {
//return Props.create(HelloActor::class.java, name)//默认方式
return Props.create(HelloActor::class.java) {
HelloActor(name)
}
}
} override fun preStart() {
log.info("preStart")
super.preStart()
} override fun postStop() {
log.info("postStop")
super.postStop()
} override fun createReceive(): Receive {
return ReceiveBuilder.create().matchAny(::onReceive).build()
} fun onReceive(msg: Any) { log.info("$name say: $msg")
log.info("sender:{}", sender.toString()) } }
package akka.demo.actor import akka.actor.AbstractActor import akka.actor.Props
import akka.japi.pf.ReceiveBuilder
import org.slf4j.LoggerFactory /**
** created by tankx
** 2019/9/10
**/
class ChildActor : AbstractActor() { private val log = LoggerFactory.getLogger(ChildActor::class.java) companion object {
fun props(): Props {
return Props.create(ChildActor::class.java)
}
} override fun preStart() {
log.info("preStart")
super.preStart()
} override fun postStop() {
log.info("postStop")
super.postStop()
} override fun createReceive(): Receive {
return ReceiveBuilder.create().matchAny(::onReceive).build()
} fun onReceive(msg: Any) {
log.info("onReceive: $msg")
} }
创建ACTOR,并发消息
val system = ActorSystem.create("akka-system") val actorRef = system.actorOf(HelloActor.props("aa"), HelloActor::class.java.simpleName) actorRef.tell("hi world", ActorRef.noSender()) //给actor发消息
依赖注入
如果有依赖注入的情况,需要传入依赖项来构建Actor
示例:
package akka.demo.actor import akka.actor.Actor
import akka.actor.IndirectActorProducer /**
** created by tankx
** 2019/9/11
** 如果有依赖注入方式可使用当前的工厂类的方式进行创建actor
**/
class ActorFactory(var applicationContext: String) : IndirectActorProducer { override fun actorClass(): Class<out Actor> {
return HelloActor::class.java
} override fun produce(): Actor {
return HelloActor(applicationContext)
} }
创建方式:
val actorFactoryRef = system.actorOf(Props.create(ActorFactory::class.java, "aaa"), "aaa")
actorFactoryRef.tell("hi factory", ActorRef.noSender())
总结:
AKKA创建Actor需要严格按照推荐的方式去创建,以避免破坏Actor 封装。
AKKA Actor创建的更多相关文章
- Akka源码分析-Actor创建(续)
在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...
- Akka源码分析-Actor创建
上一篇博客我们介绍了ActorSystem的创建过程,下面我们就研究一下actor的创建过程. val system = ActorSystem("firstActorSystem" ...
- 【原创】大叔经验分享(73)scala akka actor
import java.util.concurrent.{ExecutorService, Executors, TimeUnit} import akka.actor.{Actor, ActorSy ...
- [Scala] akka actor编程(一)
Akka基础 Akka笔记之Actor简介 Akka中的Actor遵循Actor模型.你可以把Actor当作是人.这些人不会亲自去和别人交谈.他们只通过邮件来交流. 1. 消息传递 2. 并发 3 ...
- akka actor中的基本概念(学习小结)
注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...
- 深入理解Akka Actor模型
Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语". Actor是异步驱动,可以并行和分布式部署及运 ...
- Akka: actor应用的一些小结
1.消息: 1) case class是scala中一个不可变对象(当然你可以让他成为可变的),通过不可变对象来进行消息传递可以更加明确内容,也能保证线程安全 2) 在Java中如果你将class对象 ...
- akka actor 的request-response简单实现
注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...
- Unreal Engine 4 C++ 为编辑器中Actor创建自己定义图标
有时候我们创建场景的时候,特定的Actor我们想给它一个特定的图标,便于观察.比方这样: 实现起来也非常easy.须要编写C++代码: 我们创建一个Actor,叫AMyActor.它包括一个Sprit ...
随机推荐
- Mark: 如何用Haskell写一个简单的编译器
作者:aaaron7 链接:https://www.zhihu.com/question/36756224/answer/88530013 如果是用 Haskell 的话,三篇文章足矣. prereq ...
- because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checkin
1 前言 浏览器报错误(chrome和firefox都会):because its MIME type ('text/html') is not a supported stylesheet MIME ...
- C#中 char、byte、string
var str = "我是中国人";var str1 = "abc"; char[] chars = str.ToCharArray();char[] char ...
- idea 忽略提交文件
https://blog.csdn.net/wangjun5159/article/details/74932433 https://blog.csdn.net/m0_38001814/article ...
- 盘点当下大热的7大Github机器学习创新项目
哪个平台有最新的机器学习发展现状和最先进的代码?没错——Github!本文将会分享近期发布的七大GitHub机器学习项目.这些项目广泛覆盖了机器学习的各个领域,包括自然语言处理(NLP).计算机视觉. ...
- “GIS DICTIONARY A-Z” 查询页面开发(2)——INSERT INTO数据库
今日工作:数据库连接.数据写入 一.数据库连接:使用了pymysql库 from G2_dataClean import defList import pymysql db = pymysql.con ...
- (原)pytorch中使用TensorRT
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11332155.html 代码网址: https://github.com/darkknightzh/ ...
- k8s控制器资源(五)
Pod pod在之前说过,pod是kubernetes集群中是最小的调度单元,pod中可以运行多个容器,而node又可以包含多个pod,关系如下图: 在对pod的用法进行说明之前,有必要先对docke ...
- jquery的select 2库,如果用js代码刷新选项?
遇到的需求,select的显示为select 2的样式. 那如果用户全选时,如何能让select 2的样式更新呢? 1,引入select 2 $(".select2_single" ...
- 编译出现 WARNING: 'aclocal-1.15' is missing on your system.问题解决
1. ubuntu14.04 出现这个问题,需要手动安装 Automake-1.15 2. 下载地址: http://ftp.gnu.org/gnu/automake/ http://ftp.gnu. ...