akka设计模式系列-Chain模式

2023-11-17

  链式调用在很多框架和系统中经常存在,算不得上是我自己总结的设计模式,此处只是简单介绍在Akka中的两种实现方式。我在这边博客中简化了链式调用的场景,简化后也更符合Akka的设计哲学。

trait Chained{
  def receive:Receive = Actor.emptyBehavior
}
trait IntReceiveChained1 extends Chained{
  override def receive:Receive = super.receive orElse {
    case i:Int => println(s"IntReceiveChained1 receive Int $i")
  }
}
trait IntReceiveChained extends Chained{
  override def receive:Receive = super.receive orElse {
    case i:Int => println(s"IntReceive receive Int $i")
  }
}
trait StringReceiveChained extends Chained {
  override def receive:Receive = super.receive orElse {
    case i:Int => println(s"StringReceive receive Int $i")
    case s:String => println(s"StringReceive receive String $s")
  }
}
class ChainedActor extends Actor with IntReceiveChained with StringReceiveChained with IntReceiveChained1 {
  override def receive:Receive = super.receive orElse {
    case any =>
      println(s"ChainingActor receive any $any")
  }
}
object ChainingPattern1 {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem("ChainingPattern1",ConfigFactory.load())
    val chainingActor = system.actorOf(Props(new ChainedActor),"ChainedActor")
    chainingActor ! 123
    chainingActor ! "test"
  }
}

 输出:

IntReceive receive Int 123
StringReceive receive String test

   上面这一种实现方式跟akka没有太大关系,是用scala的trait实现的。在类中调用多个Trait中都有的方法时,首先会从最右边的Trait的方法开始执行,然后依次向左执行,形成一个调用条。这个相当于设计模式中的责任链模式的一种具体实现依赖。只不过是用orElse来实现,以保证每种类型的消息都只被处理一次。我们也可以把orElse替换掉,根据条件判断是否继续调用后续函数,这个需要我们根据业务场景来选择,我就不再展开了。

  

trait Chaining { self => Actor
  private var chainedReceives = List.empty[Receive]
  def registerReceive( newReceive:Receive ): Unit = {
    chainedReceives = newReceive :: chainedReceives
  }
  def receive:Receive = chainedReceives.reduce(_ orElse _)
}
trait IntReceive extends Chaining{
  registerReceive{
    case i:Int => println(s"IntReceive receive Int $i")
  }
}
trait StringReceive extends Chaining {
  registerReceive{
    case s:String => println(s"StringReceive receive String $s")
  }
}
class ChainingActor extends Actor with IntReceive with StringReceive{
}
object ChainingPattern2 {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem("ChainingPattern2",ConfigFactory.load())
    val chainingActor = system.actorOf(Props(new ChainingActor),"chainingActor")
    chainingActor ! 123
    chainingActor ! "test"
  }
}

 输出:

IntReceive receive Int 123
StringReceive receive String test

   这种实现方式是将Receive函数注册到一个列表中,通过reduce把处理函数orElse串起来。与第一种方式一样,对相同的类型也都是只匹配一次。此处只是为了简化设计模式的介绍,读者也都可以根据需求修改对chainedReceives的处理方式,比如所有函数都匹配一遍,或者根据业务条件选择性的匹配。

  Akka的Chain模式并不常用,但非常有用。有了它,我们就可以自由组合对消息的处理过程了。如果某个receive需要对大量的消息进行处理,我们可以对消息进行分类,创建不同的链式函数去匹配处理,可以做到高内聚低耦合的效果。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

akka设计模式系列-Chain模式 的相关文章

随机推荐

  • 2020年团体程序设计天梯赛-总决赛 L2-2 口罩发放

    L2 2 口罩发放 25分 输入格式 输出格式 输入样例 输出样例 样例解释 题解 L2 2 口罩发放 25分 为了抗击来势汹汹的 COVID19 新型冠状病毒 全国各地均启动了各项措施控制疫情发展 其中一个重要的环节是口罩的发放 某市出于
  • thrift文件服务器,Apache

    The Apache Thrift software framework for scalable cross language services development combines a software stack with a c
  • python机器学习之十一 numpy库之矩阵(matrix)

    本文主要介绍numpy库中的矩阵 矩阵的创建 常见的矩阵运算 矩阵 列表 数组之间的转换 矩阵的创建 语法格式 numpy matrix data dtype data 数据 dtype 数据类型 同数组 如 m2 np matrix 1
  • 【uni-app系列】uni-app从0到1开发实例

    目录 一 准备工作 1 接口 2 代码块 二 创建项目 1 创建默认模板项目 news 2 创建 Hello uni app模板项目 hello uniapp 三 引入样式文件 四 修改入口页 五 创建详情页 六 运行 七 调试小技巧 一
  • JAVA之旅的第一步(安装JDK与JRE以及环境变量和IDEA)

    作为一名想要成为程序员的小白 我们开始肯定要学会一门语言 JAVA作为目前最为主流的编程语言 肯定是大家都要去学习的 那么如何开始我们的第一步呢 一 JDK与JRE的安装 首先我们要先安装JAVA 打开下面这个网址 注册你的Oracle账号
  • 计算机网络:应用层(HTTP协议)

    统一资源定位符 URL 1 URL的格式 统一资源定位符URL是对可以从因特网得到的资源的位置和访问方法的一种简洁的表示 URL给资源的位置提供一种抽象的识别方法 并用这种方法给资源定位 只要能够对资源定位 系统就可以对资源进行各种操作 如
  • Python基础-判断变量名是否存在

    判断alarm status变量是否存在 try alarm status except NameError alarm status exist False else alarm status exist alarm status 通过判
  • 【clickhouse】clickhouse Exception: Table is in readonly mode

    文章目录 1 概述 1 概述 clickhouse报错 Code 242 e displayText DB Exception Table is in readonly mode zookeeper path clickhouse tabl
  • 使用 access 导入表时,报错:针对该架构进行的规范 XML验证失败。以下 XML 文档中存在错误:

    在使用 access 导入表时 报错 针对该架构进行的规范 XML验证失败 以下 XML 文档中存在错误 报错原因 表名中包含除了 xlsx 之外的点 解决方法 去掉表名中多余的点即可 如下图
  • 【wireshark】如何获取一个设备的IP地址

    问题 开发中往往会出现无法知道设备正确的IP地址 从而无法连接到设备 解决方式 使用软件工具wireshark来获取设备IP地址 可以实现不同网段捕获设备IP 具体流程 1 下载wireshark抓包程序 https www wiresha
  • 全面对比linux和windows,选择哪个系统比较好

    目录 全面对比 优缺点 Linux的优点 Linux的缺点 Windows的优点 Windows的缺点 如何选择 选择Linux的情况 选择Windows的情况 总结 全面对比 下面是Linux和Windows之间的一些全面对比 1 开源
  • 使用ROS通过串口获取遥控器信号(二)

    使用ROS通过串口获取遥控器信号 二 十 编写串口通信节点 sudo gedit catkin ws src uart communication src commu cpp 加入以下代码 根据实际情况修改自己的代码 注意serial的AP
  • python世界你好的输出_Python语句print( ;世界,你好”)的输出是________。

    Python语句print 世界 你好 的输出是 答 世界 你好 供暖系统按系统管道敷设方式可以分为 式和 式 答 垂直 水平 绿茶一般不能用100 的沸水冲泡 以80 90 为宜 答 对 我国最早的指南车诞生于 答 涿鹿之战 Alexan
  • 使用vue-video-player实现直播的方式

    文章来源 学习通http www jaxp net 目录 一 安装vue video player 二 使用 vue video player 课前准备 直播流协议https www cnblogs com yangchin9 p 1493
  • 权威发布:新一代人工智能发展白皮书(2017)

    来源 机器人大讲堂 指导单位 专家顾问及编写人员 顾 问 潘云鹤 中国工程院院士 指导单位 工业和信息化部信息化和软件服务业司 指导委员会 谢少锋 工信部信软司司长 李冠宇
  • iOS相机相册调用 — UIImagePickerController

    在iOS开发中如果要调用相机拍取照片或者是直接获取相册中的照片 那么调用UIImagePickerController是个不错的选择 UIImagePickerController继承于UINavigationController 使用代理
  • uirecorder 模块化

    uirecorder 模块化 uirecorder原生代码问题 模块化 思考 有关资料 uirecorder原生代码问题 原生js文件十分臃肿 所有依赖都在一个js中 一个case一个js文件 后期维护十分困难 模块化 对原生js进行模块化
  • 修复 Python 错误TypeError: Missing 1 Required Positional Argument

    类是面向对象编程语言的基本特征之一 每个对象都属于 Python 中的某个类 我们可以创建我们的类作为蓝图来创建相同类型的对象 我们使用 class 关键字在 Python 中定义一个类 Python 中一个非常重要的特性是在定义类时使用
  • stm32学习笔记——如何理解stm32中标志位和中断位区别和联系

    1 当某个模块 比如串口 定时器 含有状态寄存器则涉及标志位和中断之间的区别 进而有库函数FlagStatus和ITStatus的使用区别 2 标志位置位 是指当某事件发生时 无论对应的中断是否使能都会使得相应的标志位置位 而当对应的中断也
  • akka设计模式系列-Chain模式

    链式调用在很多框架和系统中经常存在 算不得上是我自己总结的设计模式 此处只是简单介绍在Akka中的两种实现方式 我在这边博客中简化了链式调用的场景 简化后也更符合Akka的设计哲学 trait Chained def receive Rec