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. 《EOPL》 : CPS风格真是神奇

    计算的栈好像可以随便跳转了一样. Exception 的 try/catch , resume机制都可以借此实现 还可以实现 Erlang中的 spawn,线程调度器,以及基本的 Mutex 同步机制

  2. PIE SDK矢量栅格化算法

    1.算法功能简介 矢量栅格化,由矢量数据向栅格数据的转换一般比较方便.对于点.线目标,由其所在的栅格行.列数表示,对于面状目标,则需判定落人该面积内的像元.通常栅格(像元)尺寸均大于原来坐标表示的分辨 ...

  3. python plotly画柱状图

    代码 import pandas as pd import numpy as np import plotly.plotly as py import plotly.graph_objs as go ...

  4. mask-rcnn解读(一):clip_boxes_graph

    此部分为mask-rcnn中clip_boxes_graph()函数的使用.首先利用代码解决基本函数的使用,然后运行代码,其细节如下:代码如下: import tensorflow as tfimpo ...

  5. 类初始化应用(class初始化值用函数改变与增添)

    class Dataset(object): def __init__(self): self.image_info = [] # 初始化一个列表 def add_image(self, source ...

  6. 隐马尔科夫模型(Hidden Markov Models) 系列之四

    转自:http://blog.csdn.net/eaglex/article/details/6430389 前向算法(Forward Algorithm) 一.如果计算一个可观察序列的概率?   1 ...

  7. uni-app项目记录

    1.如何定义一个全局属性 在App.vue 文件中,以 global.属性名= XXX; 定义 在其他页面就以 global.属性名来调用 或者在min.js 中使用 Vue.prototype 挂载 ...

  8. 【转】LockSupport深入浅出

    原文:https://www.cnblogs.com/qingquanzi/p/8228422.html 本篇是<自己动手写把"锁">系列技术铺垫的最后一个知识点.本篇 ...

  9. NIO的整体认识

    目录 1.Java NIO简介 2.java NIO和IO的主要区别 3.缓冲区buffer和通道channel 3.1.缓冲区buffer 3.2.channel 4.文件通道fileChannel ...

  10. Python之request模块-基础用法

    Request模块参考中文手册:https://requests.readthedocs.io/zh_CN/latest/ Request模块 1.查看pip已装包(模块)的安装信息(模块的路径.版本 ...