在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

xxl-job通信設計流程

jf_ro2CN3Fa ? 來源:c1n.cn ? 2024-01-30 09:34 ? 次閱讀

通信底層介紹

xxl-job 使用 netty http 的方式進行通信,雖然也支持 Mina,jetty,netty tcp 等方式,但是代碼里面固定寫死的是 netty http。

通信整體流程

我以調度器通知執行器執行任務為例,繪制的活動圖:

2417a940-b8c3-11ee-8b88-92fbcf53809c.png

活動圖

驚艷的設計

看完了整個處理流程代碼,設計上可以說獨具匠心,將 netty,多線程的知識運用得行云流水。

我現在就將這些設計上出彩的點總結如下:

使用動態代理模式,隱藏通信細節

xxl-job 定義了兩個接口 ExecutorBiz,AdminBiz,ExecutorBiz 接口中封裝了向心跳,暫停,觸發執行等操作,AdminBiz 封裝了回調,注冊,取消注冊操作,接口的實現類中,并沒有通信相關的處理。

XxlRpcReferenceBean 類的 getObject() 方法會生成一個代理類,這個代理類會進行遠程通信。

全異步處理

執行器收到消息進行反序列化,并沒有同步執行任務代碼,而是將任務信息存儲在 LinkedBlockingQueue 中,異步線程從這個隊列中獲取任務信息,然后執行。

而任務的處理結果,也不是說處理完之后,同步返回的,也是放到回調線程的阻塞隊列中,異步的將處理結果返回回去。

這樣處理的好處就是減少了 netty 工作線程的處理時間,提升了吞吐量。

對異步處理的包裝

對異步處理進行了包裝,代碼看起來是同步調用的。

我們看下調度器,XxlJobTrigger 類觸發任務執行的代碼:

publicstaticReturnTrunExecutor(TriggerParamtriggerParam,Stringaddress){
ReturnTrunResult=null;
try{
ExecutorBizexecutorBiz=XxlJobScheduler.getExecutorBiz(address);
//這里面做了很多異步處理,最終同步得到處理結果
runResult=executorBiz.run(triggerParam);
}catch(Exceptione){
logger.error(">>>>>>>>>>>xxl-jobtriggererror,pleasecheckiftheexecutor[{}]isrunning.",address,e);
runResult=newReturnT(ReturnT.FAIL_CODE,ThrowableUtil.toString(e));
}

StringBufferrunResultSB=newStringBuffer(I18nUtil.getString("jobconf_trigger_run")+":");
runResultSB.append("
address:").append(address); runResultSB.append("
code:").append(runResult.getCode()); runResultSB.append("
msg:").append(runResult.getMsg()); runResult.setMsg(runResultSB.toString()); returnrunResult; }

ExecutorBiz.run 方法我們說過了,是走的動態代理,和執行器進行通信,執行器執行結果也是異步處理完,才返回的,而這里看到的 run 方法是同步等待處理結果返回。

我們看下xxl-job是如何同步獲取處理結果的:調度器向執行器發出消息后,該線程阻塞。等到執行器處理完畢后,將處理結果返回,喚醒被阻塞的線程,調用處拿到返回值。

動態代理代碼如下:

//代理類中的觸發調用
if(CallType.SYNC==callType){
//future-responseset
XxlRpcFutureResponsefutureResponse=newXxlRpcFutureResponse(invokerFactory,xxlRpcRequest,null);
try{
//doinvoke
client.asyncSend(finalAddress,xxlRpcRequest);

//futureget
XxlRpcResponsexxlRpcResponse=futureResponse.get(timeout,TimeUnit.MILLISECONDS);
if(xxlRpcResponse.getErrorMsg()!=null){
thrownewXxlRpcException(xxlRpcResponse.getErrorMsg());
}
returnxxlRpcResponse.getResult();
}catch(Exceptione){
logger.info(">>>>>>>>>>>xxl-rpc,invokeerror,address:{},XxlRpcRequest{}",finalAddress,xxlRpcRequest);

throw(einstanceofXxlRpcException)?e:newXxlRpcException(e);
}finally{
//future-responseremove
futureResponse.removeInvokerFuture();
}
}

XxlRpcFutureResponse 類中實現了線程的等待,和線程喚醒的處理:

//返回結果,喚醒線程
publicvoidsetResponse(XxlRpcResponseresponse){
this.response=response;
synchronized(lock){
done=true;
lock.notifyAll();
}
}

@Override
publicXxlRpcResponseget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException{
if(!done){
synchronized(lock){
try{
if(timeout

有的同學可能會問了,調度器接收到返回結果,怎么確定喚醒哪個線程呢?

每一次遠程調用,都會生成 uuid 的請求 id,這個 id 是在整個調用過程中一直傳遞的,就像一把鑰匙,在你回家的的時候,拿著它就帶開門。

這里拿著請求 id 這把鑰匙,就能找到對應的 XxlRpcFutureResponse,然后調用 setResponse 方法,設置返回值,喚醒線程。

publicvoidnotifyInvokerFuture(StringrequestId,finalXxlRpcResponsexxlRpcResponse){


//通過requestId找到XxlRpcFutureResponse,
finalXxlRpcFutureResponsefutureResponse=futureResponsePool.get(requestId);
if(futureResponse==null){
return;
}
if(futureResponse.getInvokeCallback()!=null){

//callbacktype
try{
executeResponseCallback(newRunnable(){
@Override
publicvoidrun(){
if(xxlRpcResponse.getErrorMsg()!=null){
futureResponse.getInvokeCallback().onFailure(newXxlRpcException(xxlRpcResponse.getErrorMsg()));
}else{
futureResponse.getInvokeCallback().onSuccess(xxlRpcResponse.getResult());
}
}
});
}catch(Exceptione){
logger.error(e.getMessage(),e);
}
}else{
//里面調用lock的notify方法
futureResponse.setResponse(xxlRpcResponse);
}

//doremove
futureResponsePool.remove(requestId);

}
審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信技術
    +關注

    關注

    20

    文章

    1135

    瀏覽量

    92288
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19712
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5261

原文標題:xxl-job驚艷的設計,怎能叫人不愛

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    《分布式_Job》——定時XXL_JOB_使用總結

    《分布式_Job》——定時XXL_JOB_使用總結
    發表于 07-08 17:56

    Spark job是怎么被調度執行的

    Spark job 的執行流程簡介
    發表于 08-22 08:24

    運行調度中心后訪問出現500錯誤怎么解決

    XXL-Job 訪問調度中心出現 500 應用程序異常
    發表于 11-08 09:39

    關于XXL-JOB定時調度器的使用總結

    XXL-JOB 定時調度器 使用小結
    發表于 04-23 14:53

    xxl conf admin在linux下面的自啟動

    【配置中心】xxl-conf配置3 - xxl-conf-admin在linux下面的自啟動
    發表于 06-10 17:30

    適用于RS-232通訊的ADM2xxL系列特性和典型應用實例

    適用于RS-232通訊的ADM2xxL系列特性和典型應用實例:
    發表于 06-17 11:26 ?22次下載
    適用于RS-232通訊的ADM2<b class='flag-5'>xxL</b>系列特性和典型應用實例

    AN-375:用于RS-232通信的ADM2xxL系列

    AN-375:用于RS-232通信的ADM2xxL系列
    發表于 05-07 19:32 ?8次下載
    AN-375:用于RS-232<b class='flag-5'>通信</b>的ADM2<b class='flag-5'>xxL</b>系列

    BK-JOB運維腳本管理系統

    bk-job.zip
    發表于 04-28 10:31 ?0次下載
    BK-<b class='flag-5'>JOB</b>運維腳本管理系統

    如何通過Output Job輸出原理圖變量

    在Output Job中選擇[Project Physical Documents],將會顯示編譯后的原理圖圖紙,其中包含圖紙上不同的變量元素。
    的頭像 發表于 09-08 11:20 ?991次閱讀

    什么是定時任務 xxl-job架構設計方案

    同一個執行器集群內AppName(xxl.job.executor.appname)需要保持一致;調度中心根據該配置動態發現不同集群的在線執行器列表。
    發表于 11-14 12:44 ?1521次閱讀

    xxl-job驚艷的設計,怎能叫人不愛

    xxl-job 定義了兩個接口 ExecutorBiz,AdminBiz,ExecutorBiz 接口中封裝了向心跳,暫停,觸發執行等操作,AdminBiz 封裝了回調,注冊,取消注冊操作,接口的實現類中,并沒有通信相關的處理。
    的頭像 發表于 12-22 14:43 ?786次閱讀

    xxl-job任務調度中間件解決定時任務的調度問題

    xxl-job是一款非常優秀的任務調度中間件,輕量級、使用簡單、支持分布式等優點,讓它廣泛應用在我們的項目中,解決了不少定時任務的調度問題。
    的頭像 發表于 01-31 09:53 ?2004次閱讀

    單向ESD保護二極管-PESD9XXL_SER

    單向ESD保護二極管-PESD9XXL_SER
    發表于 02-09 21:31 ?0次下載
    單向ESD保護二極管-PESD9<b class='flag-5'>XXL</b>_SER

    分布式定時調度:xxl-job最佳實踐方法

    定時任務是按照指定時間周期運行任務。使用場景為在某個固定時間點執行,或者周期性的去執行某個任務,比如:每天晚上24點做數據匯總,定時發送短信等。
    的頭像 發表于 11-30 11:06 ?1583次閱讀
    分布式定時調度:<b class='flag-5'>xxl-job</b>最佳實踐方法

    基于Flexus X加速MySQL鏡像搭建XXL-JOB任務調度平臺

    隨著云計算技術的飛速發展,Flexus 云服務器 X 憑借其高性能和高可用性,成為了眾多企業和開發者的首選。本文旨在通過搭建基于 Flexus X 加速 MySQL 鏡像的 XXL-JOB 任務調度
    的頭像 發表于 12-29 15:45 ?139次閱讀
    基于Flexus X加速MySQL鏡像搭建<b class='flag-5'>XXL-JOB</b>任務調度平臺
    主站蜘蛛池模板: 天天怕夜夜怕狠狠怕| 国产在线色| www.一区二区三区.com| 乱人伦的小说| 亚洲精品国产成人| 色香影视| 欧美一级视频精品观看| 免费视频爰爱太爽了| 狠狠色丁香婷婷综合久久片| 午夜色片| 色资源窝窝全色| 日韩 三级| 久久久噜久噜久久gif动图| 国产亚洲婷婷香蕉久久精品| 99一级毛片| 狼人 成人 综合 亚洲| 欧美另类自拍| 美女用手扒开尿口给男生桶爽| 亚洲色图25p| 日本h视频在线| 高清一级做a爱免费视| 特一级黄色片| 日本xxxxxxx69xx| 高h细节肉爽文bl1v1| 色之综合网| 韩国三级视频在线| 天天cao在线| 很黄很黄的网站免费的| 伊人啪| 欧美午夜色视频国产精品| 国产激烈床戏无遮挡观看| 日日摸夜夜爽夜夜爽出水| 日在线视频| 性欧美处| 最近2018中文字幕2019视频| 色综合久久中文字幕网| 黄色大片日本| 天堂网站www天堂资源在线| 午夜视频啪啪| 亚洲狠狠操| 激情综合网五月激情|