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; /** * 處理存活檢測(cè)的請(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主要是通過(guò)Class.forName加載對(duì)應(yīng)的類(lèi),然后從spring中獲取對(duì)應(yīng)的bean,再通過(guò)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)文章
Vert-x-通過(guò)異步的方式使用JDBC連接SQL
在這篇文章中,我們將會(huì)看到怎樣在vert.x應(yīng)用中使用HSQL,當(dāng)然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的異步的API,這篇文章的代碼在github2016-01-01如何使用IDEA的groovy腳本文件生成帶JPA注解的實(shí)體類(lèi)(圖文詳解)
這篇文章主要介紹了如何使用IDEA的groovy腳本文件生成帶JPA注解的實(shí)體類(lèi),本文通過(guò)圖文并茂實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java中MyBatis的動(dòng)態(tài)語(yǔ)句詳解
這篇文章主要介紹了Java中MyBatis的動(dòng)態(tài)語(yǔ)句詳解,動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一,通過(guò)不同參數(shù)生成不同的 SQL,可以動(dòng)態(tài)地對(duì)數(shù)據(jù)持久層進(jìn)行操作,而不需要每個(gè)數(shù)據(jù)訪問(wèn)操作都要進(jìn)行手動(dòng)地拼接 SQL 語(yǔ)句,需要的朋友可以參考下2023-08-08SpringBoot快速構(gòu)建應(yīng)用程序方法介紹
這篇文章主要介紹了SpringBoot快速構(gòu)建應(yīng)用程序方法介紹,涉及SpringBoot默認(rèn)的錯(cuò)誤頁(yè)面,嵌入式Web容器層面的約定和定制等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11java實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)寫(xiě)入到txt的方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)寫(xiě)入到txt的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Spring關(guān)于@Configuration配置處理流程
這篇文章主要介紹了Spring關(guān)于@Configuration配置處理流程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06java創(chuàng)建多級(jí)目錄文件的實(shí)例講解
下面小編就為大家分享一篇java創(chuàng)建多級(jí)目錄文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01java中關(guān)于控件JTextArea的幾個(gè)方法
這篇文章主要介紹了java中關(guān)于控件JTextArea的幾個(gè)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08