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创建的更多相关文章

  1. Akka源码分析-Actor创建(续)

    在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...

  2. Akka源码分析-Actor创建

    上一篇博客我们介绍了ActorSystem的创建过程,下面我们就研究一下actor的创建过程. val system = ActorSystem("firstActorSystem" ...

  3. 【原创】大叔经验分享(73)scala akka actor

    import java.util.concurrent.{ExecutorService, Executors, TimeUnit} import akka.actor.{Actor, ActorSy ...

  4. [Scala] akka actor编程(一)

    Akka基础 Akka笔记之Actor简介  Akka中的Actor遵循Actor模型.你可以把Actor当作是人.这些人不会亲自去和别人交谈.他们只通过邮件来交流.  1. 消息传递 2. 并发 3 ...

  5. akka actor中的基本概念(学习小结)

    注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...

  6. 深入理解Akka Actor模型

    Carl Hewitt 在1973年对Actor模型进行了如下定义:"Actor模型是一个把'Actor'作为并发计算的通用原语". Actor是异步驱动,可以并行和分布式部署及运 ...

  7. Akka: actor应用的一些小结

    1.消息: 1) case class是scala中一个不可变对象(当然你可以让他成为可变的),通过不可变对象来进行消息传递可以更加明确内容,也能保证线程安全 2) 在Java中如果你将class对象 ...

  8. akka actor 的request-response简单实现

    注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...

  9. Unreal Engine 4 C++ 为编辑器中Actor创建自己定义图标

    有时候我们创建场景的时候,特定的Actor我们想给它一个特定的图标,便于观察.比方这样: 实现起来也非常easy.须要编写C++代码: 我们创建一个Actor,叫AMyActor.它包括一个Sprit ...

随机推荐

  1. 实现个虚拟机只要几百行的 toy 版就够了

    关键是 指令 的 eval 并把 高层代码进行翻译. 典型的项目: 1.  java-compiler (C++) 2. 手把手教你构建 C 语言编译器(0)- 前言 | 三点水  (C)

  2. Zabbix+Grafana打造高逼格监控系统

    第一章 zabbix监控的意义 1.1 为什么要监控 业务安全性的保障 系统的保障 产品持续性的运行 1.2 监控的内容 1.3 zabbix的选择性 [x] 纯命令监控太局限性 [x] 监控三剑客( ...

  3. idea跳转到指定行列快捷键

    快捷键 Ctrl + G :

  4. js的6种继承方式

    重新理解js的6种继承方式 注:本文引用于http://www.cnblogs.com/ayqy/p/4471638.html 重点看第三点 组合继承(最常用) 写在前面 一直不喜欢JS的OOP,在学 ...

  5. .NET Core 下调用WebAPI

    前言 今天我们介绍多种客户端调用WebApi的方式,可以是原生写的,也可以借助.NET 框架下的其他HTTP库.我们一起来看看它们之间的一些异同吧- RestSharp 首先要介绍的就是这款REST ...

  6. How to use VideoToolbox to decompress H.264 video stream

    来源:http://stackoverflow.com/questions/29525000/how-to-use-videotoolbox-to-decompress-h-264-video-str ...

  7. JavaWeb Listener之HttpSessionActivationListener ,session钝化、活化

    HttpSessionActivationListener    监听HttpSession对象的活化.钝化 钝化:将HttpSession对象从内存中转移至硬盘,存储为.session文件. 活化: ...

  8. 个人项目-WC (java实现)

    一.Github地址:https://github.com/734635746/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...

  9. Django使用Mysql已存在数据表的方法

    在mysql数据库中已经存在有数据的表,自己又不想删除,下面方法可以同步django中创建的表 1.最好将自己建的表名改为前缀和django自动创建表名前缀相同,不改也可以,但是后期表太多容易混乱 2 ...

  10. LoadRunner脚本录制常见问题

    LoadRunner录制脚本时为什么不弹出IE浏览器?当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Internet ...