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. 设计模式之(十二)享元模式(Flyweight)

    享元模式思想 就以小时候导锅来说吧(导锅是我家乡的方言,就是用细沙把一个模型锅的形状拓下来,然后把铝水倒进模型中,就导好一个锅了.小时候很喜欢看的,可惜现在看不到了.上个图片回忆下)了解了这个过程后就 ...

  2. SpringMVC-拦截器做一个登录认证的小Demo

    拦截器 拦截器的定义 处理器拦截器类似于servlet开发中的filter,用于对处理器进行预处理和后处理. 定义拦截器,实现HandlerInterceptor这个接口 接口的实现需要导入包impo ...

  3. 手机网页唤醒支付宝APP发送加好友验证

    手机网页唤醒支付宝APP发送加好友验证 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  4. Qt for Android修改应用程序的图标和名称

    使用QT开发出的Android Apk安装后默认的图标是安卓的小机器人,下面介绍在QT5.12版本上修改APP名称和图标的方法. 1.  编译一次项目后,在编译目录下找到AndroidManifest ...

  5. Spark GraphX图计算简单案例【代码实现,源码分析】

    一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...

  6. day 46

    目录 CSS样式操作 给字体设置长宽 字体颜色 语义 背景图片 边框 display 盒子模型 浮动(**************) 浮动带来的影响 clear overflow溢出属性 定位 位置的 ...

  7. [转]【Servlet】Servlet的访问过程

    创建时间:6.15 Servlet的访问过程 1. 画图描述整个访问过程: *每次访问service()方法都会创建一对新的request和response对象,都不一样 2. 访问过程2: 问题:对 ...

  8. java static学习

    原创,转载请注明来源sogeisetsu的博客园 static,在类里面定义公共的属性,它可以统一修改,并只占一个内存.从而达到方便修改和少占内存的目的 先放上代码,您可以先越过代码,看后面的讲解内容 ...

  9. Codeforces 749E: Inversions After Shuffle

    题目传送门:CF749E. 记一道傻逼计数题. 题意简述: 给一个 \(1\) 到 \(n\) 的排列,随机选取区间 \([l,r]\) 随机打乱区间内的元素,问打乱后的整个序列的逆序数期望. 题解: ...

  10. 201871010104-陈园园 《面向对象程序设计(java)》第四周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...