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行为切换实现相关推荐

  1. akka actor java_现代化的Java(三)——从Hello Akka说起

    接下来打算花一些篇幅介绍一些异步编程的范式,也算是给自己一个学习笔记吧. 异步编程是个很诡异的领域,每个人都在谈论它,但是工作中很少有人能驾驭:很多很新潮很热的异步编程概念,运用起来却完全达不到它宣称 ...

  2. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

  3. scala中akka actor例子

    抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法. Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子. 本文翻译.整理于他的两篇文 ...

  4. AKKA Actor创建

    Actor 类定义 Actor 类需要继承AbstractActor类 实现createReceive方法,绑定各类actor收到不同类型消息对应处理不同业务逻辑 默认提供了ReceiveBuilde ...

  5. java akka actor性能_akka-http - 如何通过Akka HTTP(Java)与Akka Actor进行交互 - 堆栈内存溢出...

    话题 我想通过Akka HTTP与Akka Actor进行交互 . 这个想法是要有一个系统,其中HTTP客户端调用Akka HTTP服务器方法,该方法处理对Akka Actor的请求. actor处理 ...

  6. Akka Actor Inbox_信箱

    2019独角兽企业重金招聘Python工程师标准>>> Akka Actor Inbox_信箱 Inbox_send_receive Inbox 形象的表示为Actor的信箱,具有收 ...

  7. Akka Actor模型的简介与Actor的创建方式

    Akka Actor其具有以下特点: 系统中的所有事物都可以扮演一个Actor Actor之间完全独立 在收到消息时,Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序 Actor ...

  8. 【Akka】Akka Actor生命周期

    1.概述 转载:Akka Actor生命周期 用于自我学习. Actor的生命周期是使用Hooks体现和控制的,我们可以重写相关的Hooks,从而实现对Actor生命周期各环节的细粒度控制.各事件发生 ...

  9. java akka actor,【Akka】Actor引用

    Actor系统的实体 在Actor系统中,actor之间具有树形的监管结构,并且actor可以跨多个网络节点进行透明通信. 对于一个Actor而言,其源码中存在Actor,ActorContext,A ...

最新文章

  1. python snap7 简书_SnapKit真好用
  2. 【错误记录】p7zip 交叉编译 Android 版本 NDK 报错 ( error: case value evaluates to -2 , which cannot be narrowed )
  3. 网络协议系列之四:IGMP、ICMP和ARP
  4. java 克隆的作用_关于java中克隆的学习(一)
  5. 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
  6. 高通骁龙888来了!新命名就是为了中国,小米11将全球首发
  7. 【mysql】MySQL存储IP地址
  8. pandas删除有空值的一行
  9. Security+ 学习笔记34 硬件安全
  10. 文件系统 和 网络附接存储(NAS: Network Attached Storage)
  11. Java开发人员简历做假的常见情况
  12. 万能批处理工具包最终版
  13. MATLAB图像处理实验——细胞图像的分割和计数
  14. SEO利器 - 网页内容监控之百度自动推送
  15. linux gst qt,c – 致命错误:gst / gst.h:没有这样的文件或目录(使用CMake)
  16. PS图层模式详细讲解
  17. Kotlin相关博客资源
  18. 新猿木子李:0基础学python培训教程 什么是前端
  19. 概率论抽球 模型 汇总
  20. 跨域(cross-domain)访问 cookie (读取和设置)

热门文章

  1. Python学习笔记之While循环(二)
  2. C++之第一个程序Hello World,使用IO库输出Hello World
  3. oracle和mysql分组排序取第一条数据
  4. Jsonschema2pojo从JSON生成Java类(Maven)
  5. cachestat、cachetop、pcstat-linux系统缓存命中率分析工具
  6. JAVA设计模式 - 单例模式
  7. linux python tab补全_python交互模式下实现tab自动补全功能
  8. C# 利用类名字符串调用并执行类方法
  9. ES5(一)——保护对象
  10. java session 持久化_自定义实现session持久化