聊聊PowerJob的TransportServiceAware

本文主要研究一下PowerJob的TransportServiceAware

TransportServiceAware

tech/powerjob/server/remote/aware/TransportServiceAware.java

public interface TransportServiceAware extends PowerJobAware {void setTransportService(TransportService transportService);
}

TransportServiceAware继承了PowerJobAware,它定义了setTransportService方法

FriendActor

tech/powerjob/server/remote/server/FriendActor.java

@Slf4j
@Component
@Actor(path = S4S_PATH)
public class FriendActor implements TransportServiceAware {private TransportService transportService;/*** 处理存活检测的请求*/@Handler(path = S4S_HANDLER_PING, processType = ProcessType.NO_BLOCKING)public AskResponse onReceivePing(Ping ping) {return AskResponse.succeed(transportService.allProtocols());}@Handler(path = S4S_HANDLER_PROCESS, processType = ProcessType.BLOCKING)public AskResponse onReceiveRemoteProcessReq(RemoteProcessReq req) {AskResponse response = new AskResponse();response.setSuccess(true);try {response.setData(JsonUtils.toBytes(RemoteRequestProcessor.processRemoteRequest(req)));} catch (Throwable t) {log.error("[FriendActor] process remote request[{}] failed!", req, t);response.setSuccess(false);response.setMessage(ExceptionUtils.getMessage(t));}return response;}@Overridepublic void setTransportService(TransportService transportService) {this.transportService = transportService;}
}

FriendActor用于处理服务器之间的通讯,它定义了onReceivePing、onReceiveRemoteProcessReq这两个handler,其中onReceivePing返回transportService.allProtocols(),onReceiveRemoteProcessReq则执行RemoteRequestProcessor.processRemoteRequest(req)

RemoteProcessReq

tech/powerjob/server/remote/server/redirector/RemoteProcessReq.java

@Getter
@Setter
@Accessors(chain = true)
public class RemoteProcessReq implements PowerSerializable {private String className;private String methodName;private String[] parameterTypes;private Object[] args;}

RemoteProcessReq定义了className、methodName、parameterTypes、args属性

RemoteRequestProcessor

tech/powerjob/server/remote/server/redirector/RemoteRequestProcessor.java

public class RemoteRequestProcessor {public static Object processRemoteRequest(RemoteProcessReq req) throws ClassNotFoundException {Object[] args = req.getArgs();String[] parameterTypes = req.getParameterTypes();Class<?>[] parameters = new Class[parameterTypes.length];for (int i = 0; i < parameterTypes.length; i++) {parameters[i] = Class.forName(parameterTypes[i]);Object arg = args[i];if (arg != null) {args[i] = JSONObject.parseObject(JSONObject.toJSONBytes(arg), parameters[i]);}}Class<?> clz = Class.forName(req.getClassName());Object bean = SpringUtils.getBean(clz);Method method = ReflectionUtils.findMethod(clz, req.getMethodName(), parameters);assert method != null;return ReflectionUtils.invokeMethod(method, bean, args);}
}

RemoteRequestProcessor的processRemoteRequest主要是通过Class.forName加载对应的类,然后从spring中获取对应的bean,再通过ReflectionUtils查找方法,最后执行invoke

小结

TransportServiceAware继承了PowerJobAware,它定义了setTransportService方法;FriendActor用于处理服务器之间的通讯,它定义了onReceivePing、onReceiveRemoteProcessReq这两个handler,其中onReceivePing返回transportService.allProtocols(),onReceiveRemoteProcessReq则执行RemoteRequestProcessor.processRemoteRequest(req)。

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

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

相关文章

什么是非电离辐射与电离辐射?

摘要: 非电离辐射和电离辐射是两种不同类型的辐射&#xff0c;它们主要区别在于能量水平和与物质相互作用的方式。 非电离辐射 非电离辐射是指能量较低&#xff0c;不足以使原子或分子的电子脱离其原子核束缚而产生电离现象的电磁波。这类辐射不 ... 非电离辐射和电离辐射是两…

多角度俯瞰Python函数及作用

什么是函数 我们应该都学过三角函数吧&#xff0c;比如正弦函数&#xff0c;在最初接触到这方面的知识的时候&#xff0c;我们要求sin30是不是要去查一个叫做“三角函数值查表”的东西&#xff0c;然后得出sin30 0.5。 那么问题来了&#xff0c;sin30为什么会等于0.5呢&…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第四天-C++动态联编和虚函数(物联技术666)

链接:https://pan.baidu.com/s/1QO44mZtlgbiStTuI6sQP4g?pwd=1688 提取码:1688 上午:动态联编和虚函数 下午:QT介绍 教学内容: 1、动态联编和虚函数: 编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,这要求联编工作要…

国内环境 GitHub 拉取仓库速度慢的缓解方案

第一步&#xff1a; 浏览器打开如下两个网址&#xff0c;找到对应 IP 地址&#xff1a; GitHub.com - GitHub: Lets build from here GitHubgithub.global.ssl.fastly.net 假设对应 IP 地址分别为 140.82.xx.xxx 和 199.232.yy.yyy 第二步&#xff1a; 编辑 hosts 文件 sud…

openssl3.2 - 官方demo学习 - kdf - scrypt.c

文章目录 openssl3.2 - 官方demo学习 - kdf - scrypt.c概述笔记END openssl3.2 - 官方demo学习 - kdf - scrypt.c 概述 设置 kdf-SCRYPT算法的参数, 取key 笔记 /*! \file scrypt.c \note openssl3.2 - 官方demo学习 - kdf - scrypt.c 设置 kdf-SCRYPT算法的参数, 取key */…

Centos 更换内核

文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一&#xff1a;通过启动菜单更换内核方法二&#xff1a;更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

面试题:你知道 Spring lazy-init 懒加载的原理吗?

文章目录 前言一、先睹为快二、原理分析三、总结 前言 普通的bean的初始化是在容器启动初始化阶段执行的&#xff0c;而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

SpringBoot基础:一步步创建SpringBoot工程

摘要 本文介绍了&#xff0c;从零开始创建SpringBoot工程&#xff0c;且在每一步给出分析和原因。创建maven – 转Springboot – 引入jdbc – 引入数据库操作框架&#xff0c;最后给出了不同场景指定不同配置文件的方案。 背景 为什么要使用SpringBoot工程&#xff1f; 使用Sp…

Python 网络编程之粘包问题

【一】粘包问题介绍 【1】粘包和半包 粘包&#xff1a; 定义&#xff1a; 粘包指的是发送方发送的若干个小数据包被接收方一次性接收&#xff0c;形成一个大的数据包。原因&#xff1a; 通常是因为网络底层对数据传输的优化&#xff0c;将多个小数据包组合成一个大的数据块一次…

Linux搭建和使用redis

官网地址&#xff1a;http://redis.io/download 文件上传到服务器 tar包解压 tar zxvf redis-5.0.14.tar.gz安装 进入解压目录下&#xff0c;找到Makefile所在目录&#xff0c;执行make命令 make执行之后&#xff0c;会产生src等目录&#xff0c;进入执行make install命令…

locust快速入门--使用分布式提高测试压力

背景&#xff1a; 使用默认的locust启动命令进行压测时&#xff0c;尽管已经将用户数设置大比较大&#xff08;400&#xff09;&#xff0c;但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因&#xff1a; 如果你是通过命令行启动的或者参考之前文章的启动方式…

【论文阅读】Speech Driven Video Editing via an Audio-Conditioned Diffusion Model

DiffusionVideoEditing&#xff1a;基于音频条件扩散模型的语音驱动视频编辑 code&#xff1a;GitHub - DanBigioi/DiffusionVideoEditing: Official project repo for paper "Speech Driven Video Editing via an Audio-Conditioned Diffusion Model" paper&#…

第十讲 单片机驱动彩色液晶屏 控制RA8889软件:图像运算

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

大模型理论基础1

大模型理论基础1 第一章&#xff1a;引言 语言模型 自回归语言模型 概率的链式法则&#xff1a; 在自回归语言模型 p 中生成整个序列 X1:L&#xff0c;我们需要一次生成一个令牌(token)&#xff0c;该令牌基于之前以生成的令牌进行计算获得&#xff1a; 其中T≥0 是一个控…

Java 日志体系泣血总结

目录 一. 前言 二. Log 日志体系 2.1. 背景/发展史 2.2. 关系/依赖 2.2.1. JCL&#xff08;Jakarta Commons Logging&#xff09; 2.2.2. SLF4J 2.2.3. SLF4J 的适配 2.2.4. Spring 统一输出 三. 总结 一. 前言 本文的目的是搞清楚 Java 中各种日志 Log 之间是怎样的关…

【深入理解 ByteBuf 之三 接口类拆解】2. Recycler 接口设计真正的回收机制

Recycler 回收器接口设计 本节接着 ObjectPool 的设计脉络&#xff0c;具体看看其具体实现 RecyclerObjectPool 中引用的 Recycler 究竟是怎么实现的 这一张图基本已经说明白了&#xff0c;我再做个总结&#xff0c;对细节感兴趣的可以看看我下面带源码的注释。 对于 Recycle…

2023.1.15 关于 Redis 持久化 RDB 策略详解

目录 Redis 持久化 Redis 实现持久化的两大策略 RDB 策略 手动触发 save 命令 bgsave 命令 bgsave 命令执行流程 自动触发 rdb 文件 实例演示一 实例演示二 实例演示三 实例演示四 RDB 策略的优缺点 Redis 持久化 什么是持久化&#xff1f; 回答&#xff1a; 将数据存…

SeaTunnel 海量数据同步工具的使用(连载中……)

一、概述 SeaTunnel 是一个非常易用&#xff0c;高性能、支持实时流式和离线批处理的海量数据处理产品&#xff0c;前身是 WaterDrop &#xff08;中文名&#xff1a;水滴&#xff09;&#xff0c;自 2021年10月12日更名为 SeaTunnel 。2021年12月9日&#xff0c;SeaTunnel 正式…