akka actor行为切换实现
Akka中actor行为的切换实际是actor的receive的函数的选择切换。
通过become()方式切换行为。
在ActorCell中维护着一个可伸缩List实现的行为堆栈。
private var behaviorStack: List[Actor.Receive] = emptyBehaviorStack
在actor接受到消息的时候,将会调用堆栈顶部的函数。
final def receiveMessage(msg: Any): Unit = actor.aroundReceive(behaviorStack.head, msg)
当通过become()切换行为模式的时候,实则就是将新的行为,也就是需要采用的receive函数放到行为堆栈的顶部。
def become(behavior: Actor.Receive, discardOld: Boolean = true): Unit =behaviorStack = behavior :: (if (discardOld && behaviorStack.nonEmpty) behaviorStack.tail else behaviorStack)
因此,如果不断通过become()函数切换行为,将存在栈溢出的风险,所以如果需要切换行为模式,需要通过unbecome()函数出栈。
def unbecome(): Unit = {val original = behaviorStackbehaviorStack =if (original.isEmpty || original.tail.isEmpty) actor.receive :: emptyBehaviorStackelse original.tail
}
akka actor行为切换实现相关推荐
- akka actor java_现代化的Java(三)——从Hello Akka说起
接下来打算花一些篇幅介绍一些异步编程的范式,也算是给自己一个学习笔记吧. 异步编程是个很诡异的领域,每个人都在谈论它,但是工作中很少有人能驾驭:很多很新潮很热的异步编程概念,运用起来却完全达不到它宣称 ...
- akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...
Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...
- scala中akka actor例子
抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法. Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子. 本文翻译.整理于他的两篇文 ...
- AKKA Actor创建
Actor 类定义 Actor 类需要继承AbstractActor类 实现createReceive方法,绑定各类actor收到不同类型消息对应处理不同业务逻辑 默认提供了ReceiveBuilde ...
- java akka actor性能_akka-http - 如何通过Akka HTTP(Java)与Akka Actor进行交互 - 堆栈内存溢出...
话题 我想通过Akka HTTP与Akka Actor进行交互 . 这个想法是要有一个系统,其中HTTP客户端调用Akka HTTP服务器方法,该方法处理对Akka Actor的请求. actor处理 ...
- Akka Actor Inbox_信箱
2019独角兽企业重金招聘Python工程师标准>>> Akka Actor Inbox_信箱 Inbox_send_receive Inbox 形象的表示为Actor的信箱,具有收 ...
- Akka Actor模型的简介与Actor的创建方式
Akka Actor其具有以下特点: 系统中的所有事物都可以扮演一个Actor Actor之间完全独立 在收到消息时,Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序 Actor ...
- 【Akka】Akka Actor生命周期
1.概述 转载:Akka Actor生命周期 用于自我学习. Actor的生命周期是使用Hooks体现和控制的,我们可以重写相关的Hooks,从而实现对Actor生命周期各环节的细粒度控制.各事件发生 ...
- java akka actor,【Akka】Actor引用
Actor系统的实体 在Actor系统中,actor之间具有树形的监管结构,并且actor可以跨多个网络节点进行透明通信. 对于一个Actor而言,其源码中存在Actor,ActorContext,A ...
最新文章
- python snap7 简书_SnapKit真好用
- 【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( error: case value evaluates to -2 , which cannot be narrowed )
- 网络协议系列之四:IGMP、ICMP和ARP
- java 克隆的作用_关于java中克隆的学习(一)
- 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
- 高通骁龙888来了!新命名就是为了中国,小米11将全球首发
- 【mysql】MySQL存储IP地址
- pandas删除有空值的一行
- Security+ 学习笔记34 硬件安全
- 文件系统 和 网络附接存储(NAS: Network Attached Storage)
- Java开发人员简历做假的常见情况
- 万能批处理工具包最终版
- MATLAB图像处理实验——细胞图像的分割和计数
- SEO利器 - 网页内容监控之百度自动推送
- linux gst qt,c – 致命错误:gst / gst.h:没有这样的文件或目录(使用CMake)
- PS图层模式详细讲解
- Kotlin相关博客资源
- 新猿木子李:0基础学python培训教程 什么是前端
- 概率论抽球 模型 汇总
- 跨域(cross-domain)访问 cookie (读取和设置)
热门文章
- Python学习笔记之While循环(二)
- C++之第一个程序Hello World,使用IO库输出Hello World
- oracle和mysql分组排序取第一条数据
- Jsonschema2pojo从JSON生成Java类(Maven)
- cachestat、cachetop、pcstat-linux系统缓存命中率分析工具
- JAVA设计模式 - 单例模式
- linux python tab补全_python交互模式下实现tab自动补全功能
- C# 利用类名字符串调用并执行类方法
- ES5(一)——保护对象
- java session 持久化_自定义实现session持久化