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;
/**
* 處理存活檢測的請(qǐng)求
*/
@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;
}
@Override
public void setTransportService(TransportService transportService) {
this.transportService = transportService;
}
}FriendActor用于處理服務(wù)器之間的通訊,它定義了onReceivePing、onReceiveRemoteProcessReq這兩個(gè)handler,其中onReceivePing返回transportService.allProtocols(),onReceiveRemoteProcessReq則執(zhí)行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加載對(duì)應(yīng)的類,然后從spring中獲取對(duì)應(yīng)的bean,再通過ReflectionUtils查找方法,最后執(zhí)行invoke
小結(jié)
TransportServiceAware繼承了PowerJobAware,它定義了setTransportService方法;FriendActor用于處理服務(wù)器之間的通訊,它定義了onReceivePing、onReceiveRemoteProcessReq這兩個(gè)handler,其中onReceivePing返回transportService.allProtocols(),onReceiveRemoteProcessReq則執(zhí)行RemoteRequestProcessor.processRemoteRequest(req)。
以上就是PowerJob的TransportServiceAware工作流程源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于PowerJob TransportServiceAware的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用IDEA的groovy腳本文件生成帶JPA注解的實(shí)體類(圖文詳解)
這篇文章主要介紹了如何使用IDEA的groovy腳本文件生成帶JPA注解的實(shí)體類,本文通過圖文并茂實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Java中MyBatis的動(dòng)態(tài)語句詳解
這篇文章主要介紹了Java中MyBatis的動(dòng)態(tài)語句詳解,動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一,通過不同參數(shù)生成不同的 SQL,可以動(dòng)態(tài)地對(duì)數(shù)據(jù)持久層進(jìn)行操作,而不需要每個(gè)數(shù)據(jù)訪問操作都要進(jìn)行手動(dòng)地拼接 SQL 語句,需要的朋友可以參考下2023-08-08
SpringBoot快速構(gòu)建應(yīng)用程序方法介紹
這篇文章主要介紹了SpringBoot快速構(gòu)建應(yīng)用程序方法介紹,涉及SpringBoot默認(rèn)的錯(cuò)誤頁面,嵌入式Web容器層面的約定和定制等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11
java實(shí)現(xiàn)數(shù)據(jù)庫的數(shù)據(jù)寫入到txt的方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)數(shù)據(jù)庫的數(shù)據(jù)寫入到txt的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Spring關(guān)于@Configuration配置處理流程
這篇文章主要介紹了Spring關(guān)于@Configuration配置處理流程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
java創(chuàng)建多級(jí)目錄文件的實(shí)例講解
下面小編就為大家分享一篇java創(chuàng)建多級(jí)目錄文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
java中關(guān)于控件JTextArea的幾個(gè)方法
這篇文章主要介紹了java中關(guān)于控件JTextArea的幾個(gè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

