AKKA 互相调用

SpringBoot 集成 AKKA 可以参考此文:SpringBoot 集成 AKKA

场景1:bossActor 收到信息,然后发给 worker1Actor 和 worker2Actor

controller 入口,初次调用 ActorRef.noSender()

@Tag(name = "test")
@RestController
@RequestMapping("/test")
@Validated
@Inner(value = false)
public class TestController {@Resourceprivate ActorSystem actorSystem;@PostMapping("/test")@Operation(summary = "test")public R search( ) {ActorRef pcm = actorSystem.actorOf(Props.create(BossActor.class));pcm.tell("I AM MASTER.TELLING BOSS", ActorRef.noSender());return R.ok();}
}

BossActor
接受 TestController 发送的信息,同时发送消息给 worker1Actor 和 worker2Actor

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedAbstractActor;public class BossActor extends UntypedAbstractActor {private ActorRef worker1Actor;private ActorRef worker2Actor;public BossActor() {this.worker1Actor = this.context().actorOf(Props.create(Worker1Actor.class));this.worker2Actor = this.context().actorOf(Props.create(Worker2Actor.class));}@Overridepublic void onReceive(Object message) {System.out.println("Boss 收到 master 的消息:" + message);worker1Actor.tell("I AM BOSS, TELLING WORKER1", self());worker2Actor.tell("I AM BOSS, TELLING WORKER2", self());}
}

Worker1Actor 和 Worker2Actor 获取 BossActor 的消息

import akka.actor.UntypedAbstractActor;public class Worker1Actor extends UntypedAbstractActor {@Overridepublic void onReceive(Object message) {System.out.println("worker1 收到 boss 消息:" + message);}
}
import akka.actor.UntypedAbstractActor;public class Worker2Actor extends UntypedAbstractActor {@Overridepublic void onReceive(Object message) {System.out.println("worker2 收到 boss 消息:" + message);}
}

打印输出
在这里插入图片描述
 
 
场景2:boss 发消息给 worker1,worker1 收到后发给 worker2,worker2 完成后返回 worker1,worker1再返回给 boss

分析难点:
1、由于 Actor 只能记住最后发消息给自己的人,所以 worker1 接到 worker2 消息后,getSender 只记住 worker2 ,找不到 boss 的地址
2、Actor 的 onReceive 方法接受的是消息,没有针对发送人,worker1 需要针对不同发送人 boss 和 worker2 做不同处理

针对问题2,我们可以设计一个实体 ReceiveDTO,里面包含 sender 发送人和 message 具体传参,所有消息严格实现这个类型

@Data
public class ReceiveDTO {String sender;Object message;
}

controller 入口,初次调用 ActorRef.noSender()

  @Resourceprivate ActorSystem actorSystem;@PostMapping("/test")@Operation(summary = "test")public R search() {ActorRef pcm = actorSystem.actorOf(Props.create(BossActor.class));ReceiveDTO receiveDTO = new ReceiveDTO();receiveDTO.setSender("start");receiveDTO.setMessage("start");pcm.tell(receiveDTO, ActorRef.noSender());return R.ok();}

BossActor,根据 receiveDTO.getSender() 判断发送人是谁

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedAbstractActor;public class BossActor extends UntypedAbstractActor {private ActorRef worker1Actor;public BossActor() {this.worker1Actor = this.context().actorOf(Props.create(Worker1Actor.class));}@Overridepublic void onReceive(Object message) {ReceiveDTO receiveDTO = (ReceiveDTO) message;if (receiveDTO.getSender().equals("start")) {receiveDTO.setMessage("I AM BOSS, TELLING WORKER1");receiveDTO.setSender("boss");System.out.println("boss start");worker1Actor.tell(receiveDTO, self());}if (receiveDTO.getSender().equals("worker1")) {System.out.println("boss end 收到 worker1 消息: " + receiveDTO.getMessage());}}
}

Worker1Actor 接收 boss 信息时,同时把 boss 的 ActorRef 存到 bossActor,解决难题1

import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedAbstractActor;public class Worker1Actor extends UntypedAbstractActor {private ActorRef bossActor;private ActorRef worker2Actor;public Worker1Actor() {this.worker2Actor = this.context().actorOf(Props.create(Worker2Actor.class));}@Overridepublic void onReceive(Object message) {ReceiveDTO receiveDTO = (ReceiveDTO) message;if (receiveDTO.getSender().equals("boss")) {System.out.println("worker1 收到 boss 消息: " + receiveDTO.getMessage());this.bossActor = getSender();ReceiveDTO receive1 = new ReceiveDTO();receive1.setMessage("I AM WORKER1, TELLING WORKER2");worker2Actor.tell(receive1, self());}if (receiveDTO.getSender().equals("worker2")) {System.out.println("worker1 收到 worker2 消息: " + receiveDTO.getMessage());ReceiveDTO receive1 = new ReceiveDTO();receive1.setMessage("I AM WORKER1, TELLING boss, job is over");receive1.setSender("worker1");bossActor.tell(receive1, self());}}
}

Worker2Actor

import akka.actor.UntypedAbstractActor;public class Worker2Actor extends UntypedAbstractActor {@Overridepublic void onReceive(Object message) {ReceiveDTO receiveDTO = (ReceiveDTO) message;System.out.println("worker2 收到 worker1 消息:" + receiveDTO.getMessage());ReceiveDTO receive1 = (ReceiveDTO) message;receive1.setSender("worker2");receive1.setMessage("I AM WORKER2, TELLING WORKER1");getSender().tell(receive1, self());}
}

打印输出

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现【更新中】

【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现 本文介绍基于libsvm代理模型算法的特征排序方法合集,包括: 1.基于每个特征预测精度进行排序(libsvm代理模型) 2.基于相关系数corr的…

前端技术社区总目录

前端技术社区欢迎您的订阅。订阅后,您将可以查看以下所有博客内容。 注:专栏内容主要面向新手 注:每个示例都有相对应的完整代码 注:该专栏博客内容将会逐步迁移至https://blog.csdn.net/m0_60387551/article/details/128017725 …

用于自然语言处理的 Python:理解文本数据

一、说明 Python是一种功能强大的编程语言,在自然语言处理(NLP)领域获得了极大的普及。凭借其丰富的库集,Python 为处理和分析文本数据提供了一个全面的生态系统。在本文中,我们将介绍 Python for NLP 的一些基础知识&…

Sound/播放提示音, Haptics/触觉反馈, LocalNotification/本地通知 的使用

1. Sound 播放提示音 1.1 音频文件: tada.mp3, badum.mp3 1.2 文件位置截图: 1.3 实现 import AVKit/// 音频管理器 class SoundManager{// 单例对象 Singletonstatic let instance SoundManager()// 音频播放var player: AVAudioPlayer?enum SoundOption: Stri…

【C++】stack queue

stack & queue 一、容器适配器二、deque(了解)三、stack1. stack 的介绍2. 模拟实现 stack 四、queue1. queue 的使用2. 模拟实现 queue3. priority_queue(1)priority_queue 的介绍(2)priority_queue 的…

从零开始—【Mac系统】MacOS配置Java环境变量

系统环境说明 Apple M1 macOS Ventura 版本13.5.2 1.下载JDK安装包 Oracle官网下载地址 JDK下载【注:推荐下载JDK8 Oracle官网JDK8下载】 关于JDK、JRE、JVM的关系说明 JDK(Java Development Kit,Java开发工具包) ,是整个JAVA的核心&#…

系统学习Mysql

1.select语句 关键字执行顺序: 1.from 2.where 3.group by 4.select 5.having 6.order by 7.limit SQL 语句执行顺序如下: FROM: 指定要查询的表或子查询,可以包含 JOIN、WHERE 子句过滤等。 WHERE: 对 FROM 子句指定的表或子查询进行限制和…

快速使用Spring Cache

哈喽~大家好,这篇我们来看看快速使用Spring Cache。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏:【日常学习上的分享】 🥉与这篇相关的文章: R…

【优测云服务平台】打造承载百倍级增长后台背后的力量-性能优化

项目介绍: 腾讯课堂是腾讯推出的专业在线教育平台,凭借技术优势,实现在线即时互动教学,打破地域的限制,让每个人都能接受优秀老师的指导和教学。 一、背景 2020年初,新冠病毒肆虐,疫情大面积爆…

从裸机开始安装操作系统

目录 一、预置知识 电脑裸机 win10版本 官方镜像 V.S. 正版系统 二、下载微软官方原版系统镜像 三、使用微PE系统维护U盘 四、安装操作系统 五、总结 一、预置知识 电脑裸机 ●只有硬件部分,还未安装任何软件系统的电脑叫做裸机。 ●主板、硬盘、显卡等必…

LLM - 通俗理解位置编码与 RoPE

目录 一.引言 二.Why 位置编码? 三.What 绝对位置编码? 1.绝对位置编码 A.Embedding Table B.公式计算 2.外推性 四.How 位置编码? 1.直接编号 2.乘法表示 3.严格的乘法表示 4.距离衰减 五.Thats RoPE! 1.Self-Attention 2.RoPE 的复数形式 3.RoP…

前端就业宝典---目录

工作时候扭螺丝,面试时候造火箭,现状就是如此。不管是背八股文,还是掌握了知识的精华,对答如流才是硬道理。本专栏就是要集具前端精华,规范、算法、架构、封装、原理等一并汇集,让前端的小伙伴有个思路。 大剑师的微信 gis-dajianshi, 欢迎一起交流,并非常期望您能够提…

Spring Cloud Alibaba Ribbon负载均衡器

文章目录 Ribbon 负载均衡器环境搭建1.依赖2.配置3.修改其默认的负载均衡策略3.1 验证 4.创建自定义的Rule4.1 MyRule()4.2 在配置config类中配置 5.饥饿加载6.我只想访问不想被别的访问 Ribbon 负载均衡器 背景 Ribbon 是一个用于客户端负载均衡的开源…

提高接口自动化测试效率:使用 JMESPath 实现断言和数据提取!

前言 做接口自动化,断言是比不可少的。如何快速巧妙的提取断言数据就成了关键,当然也可以提高用例的编写效率。笔者在工作中接触到了JMESPath,那到底该如何使用呢?带着疑惑一起往下看。 JMESPath是啥? JMESPath 是一…

ARM Soc内部总线

由于soc架构,把常用外设(控制器)集成到芯片内部,所以需要一种总线协调ARMcore与这些内部外设的通信,于是有了APB and AHB以及AXi这种片上总线。 同时要注意与常说的PC时代总线区分开: CPU总线(…

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时,通常着重考虑三个主要层次:业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性,用户需求明确最终用户的期望,而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…

工业蒸汽量预测(速通三)

工业蒸汽量预测(三) 特征优化1特征优化的方法1.1合成特征1.2特征的简单变换1.3用决策树创造新特征1.4特征组合 模型融合1模型优化1.1模型学习曲线1.2模型融合提升技术1.3预测结果融合策略1.4其他提升方法 特征优化 1特征优化的方法 可以通过合成特征、…

【LeetCode】力扣364.周赛题解

Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 1.最大二进制奇数 🍉题目: 🍉例子: 🍉 题解: 首先看题目,最大二进制奇数,在一个二…

MQ - 31 基础功能: 优先级队列的设计

文章目录 导图概述什么是优先级队列如何设计实现优先级队列业务实现优先级队列的效果内核支持优先级队列RabbitMQ 中优先级队列的实现总结导图 概述 当我们需要在业务中对消息设置优先级,让优先级高的消息能被优先消费,此时就需要用到消息队列中优先级队列的特性。 为了了解…

前后端分离vue简介

vue简介 vue是一个渐进式js框架,用于构建用户界面,其主要特点是易学易用、轻量、灵活和高效。Vue.js由前Google工程师尤雨溪( Evan You)在2014年创建,它的核心库只关注视图层,是一款非常优秀的MVVM框架&…