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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

xxl-job驚艷的設(shè)計(jì),怎能叫人不愛(ài)

jf_ro2CN3Fa ? 來(lái)源:c1n.cn/N8Mln ? 2022-12-22 14:43 ? 次閱讀

  • 通信底層介紹
  • 通信整體流程
  • 驚艷的設(shè)計(jì)

通信底層介紹

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

通信整體流程

我以調(diào)度器通知執(zhí)行器執(zhí)行任務(wù)為例,繪制的活動(dòng)圖:

cafb50e6-81b9-11ed-8abf-dac502259ad0.png活動(dòng)圖

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

驚艷的設(shè)計(jì)

看完了整個(gè)處理流程代碼,設(shè)計(jì)上可以說(shuō)獨(dú)具匠心,將 netty,多線程的知識(shí)運(yùn)用得行云流水。

我現(xiàn)在就將這些設(shè)計(jì)上出彩的點(diǎn)總結(jié)如下:

使用動(dòng)態(tài)代理模式,隱藏通信細(xì)節(jié)

xxl-job 定義了兩個(gè)接口 ExecutorBiz,AdminBiz,ExecutorBiz 接口中封裝了向心跳,暫停,觸發(fā)執(zhí)行等操作,AdminBiz 封裝了回調(diào),注冊(cè),取消注冊(cè)操作,接口的實(shí)現(xiàn)類中,并沒(méi)有通信相關(guān)的處理。

XxlRpcReferenceBean 類的 getObject() 方法會(huì)生成一個(gè)代理類,這個(gè)代理類會(huì)進(jìn)行遠(yuǎn)程通信。

全異步處理

執(zhí)行器收到消息進(jìn)行反序列化,并沒(méi)有同步執(zhí)行任務(wù)代碼,而是將任務(wù)信息存儲(chǔ)在 LinkedBlockingQueue 中,異步線程從這個(gè)隊(duì)列中獲取任務(wù)信息,然后執(zhí)行。

而任務(wù)的處理結(jié)果,也不是說(shuō)處理完之后,同步返回的,也是放到回調(diào)線程的阻塞隊(duì)列中,異步的將處理結(jié)果返回回去。

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

對(duì)異步處理的包裝

對(duì)異步處理進(jìn)行了包裝,代碼看起來(lái)是同步調(diào)用的。

我們看下調(diào)度器,XxlJobTrigger 類觸發(fā)任務(wù)執(zhí)行的代碼:

publicstaticReturnTrunExecutor(TriggerParamtriggerParam,Stringaddress){
ReturnTrunResult=null;
try{
ExecutorBizexecutorBiz=XxlJobScheduler.getExecutorBiz(address);
//這里面做了很多異步處理,最終同步得到處理結(jié)果
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 方法我們說(shuō)過(guò)了,是走的動(dòng)態(tài)代理,和執(zhí)行器進(jìn)行通信,執(zhí)行器執(zhí)行結(jié)果也是異步處理完,才返回的,而這里看到的 run 方法是同步等待處理結(jié)果返回。

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

動(dòng)態(tài)代理代碼如下:

//代理類中的觸發(fā)調(diào)用
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 類中實(shí)現(xiàn)了線程的等待,和線程喚醒的處理:

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

@Override
publicXxlRpcResponseget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException{
if(!done){
synchronized(lock){
try{
if(timeout0){
//線程阻塞
lock.wait();
}else{
longtimeoutMillis=(TimeUnit.MILLISECONDS==unit)?timeout:TimeUnit.MILLISECONDS.convert(timeout,unit);
lock.wait(timeoutMillis);
}
}catch(InterruptedExceptione){
throwe;
}
}
}

if(!done){
thrownewXxlRpcException("xxl-rpc,requesttimeoutat:"+System.currentTimeMillis()+",request:"+request.toString());
}
returnresponse;
}

有的同學(xué)可能會(huì)問(wèn)了,調(diào)度器接收到返回結(jié)果,怎么確定喚醒哪個(gè)線程呢?

每一次遠(yuǎn)程調(diào)用,都會(huì)生成 uuid 的請(qǐng)求 id,這個(gè) id 是在整個(gè)調(diào)用過(guò)程中一直傳遞的,就像一把鑰匙,在你回家的的時(shí)候,拿著它就帶開門。

這里拿著請(qǐng)求 id 這把鑰匙,就能找到對(duì)應(yīng)的 XxlRpcFutureResponse,然后調(diào)用 setResponse 方法,設(shè)置返回值,喚醒線程。

publicvoidnotifyInvokerFuture(StringrequestId,finalXxlRpcResponsexxlRpcResponse){

//通過(guò)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{
//里面調(diào)用lock的notify方法
futureResponse.setResponse(xxlRpcResponse);
}

//doremove
futureResponsePool.remove(requestId);

}


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6184

    瀏覽量

    137467
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70343

原文標(biāo)題:xxl-job驚艷的設(shè)計(jì),怎能叫人不愛(ài)

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    紫光閃存UNIS PN C2 PSSD怎么樣

    大好春光,怎能宅家辜負(fù)?當(dāng)你奔赴花海,手機(jī)咔咔不停,是不是常被數(shù)據(jù)存儲(chǔ)難題搞得心煩意亂?別愁啦,紫光閃存 UNIS PN C2 PSSD 來(lái)救場(chǎng)咯!
    的頭像 發(fā)表于 04-15 16:44 ?346次閱讀

    IMX6ULL如何通過(guò)USB將CANON LBP6030w激光打印機(jī)連接到其中?

    /2025:04:36:10 +0000] [Job 28] cfFilterGhostscript: Unable to open raster stream - : Broken pipe E
    發(fā)表于 03-20 07:24

    Flexus X 初體驗(yàn)之部署 xxl-job - 分布式任務(wù)調(diào)度平臺(tái)

    前言? ? ? ?? ????????第二次參加華為和 CSDN 的測(cè)評(píng)活動(dòng)了,這一次測(cè)試的呢是華為云 Flexus 系列的云服務(wù) X 實(shí)例,這個(gè) Flexus X 產(chǎn)品和我們經(jīng)常用的 ECS 彈性服務(wù)器來(lái)說(shuō)呢是有一些區(qū)別的,ECS 一般指的是彈性云服務(wù)器, 而 Flexus 應(yīng)用服務(wù)器 L 實(shí)例可視為輕量級(jí)應(yīng)用服務(wù)器,主要是滿足一些我們簡(jiǎn)單的 WEB 部署這些,適配一些簡(jiǎn)單的小型的應(yīng)用或者場(chǎng)景.?Flexus 云服務(wù)器 X 實(shí)例則位于 L 實(shí)例和 ECS 之間(也可以當(dāng)作 ECS,畢竟控制臺(tái)顯示的就是 ECS)。X 實(shí)例通過(guò)提供更
    的頭像 發(fā)表于 01-23 17:29 ?362次閱讀
    Flexus X 初體驗(yàn)之部署 <b class='flag-5'>xxl-job</b> - 分布式任務(wù)調(diào)度平臺(tái)

    N32A455xxL8系列產(chǎn)品簡(jiǎn)介

    電子發(fā)燒友網(wǎng)站提供《N32A455xxL8系列產(chǎn)品簡(jiǎn)介.pdf》資料免費(fèi)下載
    發(fā)表于 01-22 16:37 ?0次下載
    N32A455<b class='flag-5'>xxL</b>8系列產(chǎn)品簡(jiǎn)介

    N32A455xxL7系列產(chǎn)品簡(jiǎn)介

    電子發(fā)燒友網(wǎng)站提供《N32A455xxL7系列產(chǎn)品簡(jiǎn)介.pdf》資料免費(fèi)下載
    發(fā)表于 01-22 15:37 ?0次下載
    N32A455<b class='flag-5'>xxL</b>7系列產(chǎn)品簡(jiǎn)介

    在 Flexus X 上部署 ELK 日志系統(tǒng)

    Flexus X 上部署 Mysql 和一套 xxl-job 分布式任務(wù)管理系統(tǒng),完成了 Flexus X 的首次操作,本次我
    的頭像 發(fā)表于 01-02 11:59 ?297次閱讀
    在 Flexus X 上部署 ELK 日志系統(tǒng)

    基于Flexus X加速M(fèi)ySQL鏡像搭建XXL-JOB任務(wù)調(diào)度平臺(tái)

    隨著云計(jì)算技術(shù)的飛速發(fā)展,F(xiàn)lexus 云服務(wù)器 X 憑借其高性能和高可用性,成為了眾多企業(yè)和開發(fā)者的首選。本文旨在通過(guò)搭建基于 Flexus X 加速 MySQL 鏡像的 XXL-JOB 任務(wù)調(diào)度
    的頭像 發(fā)表于 12-29 15:45 ?410次閱讀
    基于Flexus X加速M(fèi)ySQL鏡像搭建<b class='flag-5'>XXL-JOB</b>任務(wù)調(diào)度平臺(tái)

    盤點(diǎn)Linux系統(tǒng)中的常見(jiàn)命令

    作為運(yùn)維同學(xué)怎能不知道Linux系統(tǒng)中的lsmod、lsof、lspci、lsscsi命令呢,今天就來(lái)盤一盤她及實(shí)例。
    的頭像 發(fā)表于 12-03 09:48 ?730次閱讀
    盤點(diǎn)Linux系統(tǒng)中的常見(jiàn)命令

    ads7952在一個(gè)job里面發(fā)送多條channel指令給ads,ads的通信特點(diǎn)是否能夠支持,其工作邏輯是怎樣的?

    ads7952在autosar架構(gòu)下用spi異步通訊,dma存取數(shù)據(jù)。 在一個(gè)job里面發(fā)送多條channel指令給ads,ads的通信特點(diǎn)是否能夠支持,其工作邏輯是怎樣的。 或者是否有其他類似的實(shí)現(xiàn)方案。
    發(fā)表于 11-29 06:51

    聯(lián)誠(chéng)發(fā)LED屏驚艷亮相土耳其廣告展

    近日,第25屆國(guó)際廣告業(yè)和數(shù)字印刷技術(shù)博覽會(huì)(簡(jiǎn)稱 Sign Istanbul )在土耳其伊斯坦布爾隆重舉行。聯(lián)誠(chéng)發(fā)攜多款創(chuàng)新LED顯示產(chǎn)品及多領(lǐng)域的應(yīng)用解決方案驚艷亮相,為全球客戶打造沉浸式視覺(jué)盛宴,展會(huì)現(xiàn)場(chǎng)人流絡(luò)繹不絕,熱鬧非凡。
    的頭像 發(fā)表于 11-04 17:47 ?721次閱讀

    【新品推介】可輸出3A大電流的DC-DC電源降壓芯片-XXL1509

    01產(chǎn)品說(shuō)明XXL1509是一款高效降壓型DC-DC電源轉(zhuǎn)換器,固定150KHz開關(guān)頻率,可提供3A輸出電流能力,具有低紋波,出色的線性調(diào)整率與負(fù)載調(diào)整率特點(diǎn)。XXL1509內(nèi)置固定頻率振蕩器與頻率
    的頭像 發(fā)表于 10-29 08:06 ?1662次閱讀
    【新品推介】可輸出3A大電流的DC-DC電源降壓芯片-<b class='flag-5'>XXL</b>1509

    北京安防博覽會(huì)圓滿閉幕!華電子智慧路燈全網(wǎng)運(yùn)維管理驚艷全場(chǎng)!

    北京安防博覽會(huì)圓滿閉幕!華電子智慧路燈全網(wǎng)運(yùn)維管理驚艷全場(chǎng)!
    的頭像 發(fā)表于 10-28 10:32 ?449次閱讀
    北京安防博覽會(huì)圓滿閉幕!華電子智慧路燈全網(wǎng)運(yùn)維管理<b class='flag-5'>驚艷</b>全場(chǎng)!

    揚(yáng)帆出海!九章云極DataCanvas公司驚艷亮相迪拜GITEX Global 2024

    近日,第44屆GITEXGLOBAL展會(huì)(GITEXGLOBAL2024)及全球領(lǐng)先的創(chuàng)業(yè)與投資盛會(huì)ExpandNorthStar2024在迪拜盛大啟幕。九章云極DataCanvas公司驚艷亮相盛會(huì)
    的頭像 發(fā)表于 10-18 17:08 ?532次閱讀
    揚(yáng)帆出海!九章云極DataCanvas公司<b class='flag-5'>驚艷</b>亮相迪拜GITEX Global 2024

    智動(dòng)未來(lái)!廣和通AI解決方案驚艷2024世界機(jī)器人大會(huì)

    8月21-25日,2024世界機(jī)器人大會(huì)在北京經(jīng)開區(qū)北人亦創(chuàng)國(guó)際會(huì)展中心順利開幕,廣和通攜一系列端側(cè)AI產(chǎn)品及解決方案驚艷亮相A館A167展位,與產(chǎn)業(yè)伙伴探討“機(jī)器人+”應(yīng)用場(chǎng)景與AI技術(shù),攜手推進(jìn)機(jī)器人領(lǐng)域的創(chuàng)新合作。
    的頭像 發(fā)表于 08-22 10:57 ?825次閱讀
    智動(dòng)未來(lái)!廣和通AI解決方案<b class='flag-5'>驚艷</b>2024世界機(jī)器人大會(huì)

    折疊屏旗艦榮耀Magic V3將攜其突破性設(shè)計(jì)驚艷亮相

    科技的盛宴將于7月12日拉開帷幕,屆時(shí),備受期待的全新一代折疊屏旗艦——榮耀Magic V3,將攜其突破性設(shè)計(jì)驚艷亮相,并提前展示了其外觀設(shè)計(jì)上的獨(dú)特魅力。
    的頭像 發(fā)表于 07-08 17:13 ?1075次閱讀
    主站蜘蛛池模板: 草草影院www色极品欧美 | 天堂网在线最新版www中文网 | 午夜视频在线观看免费高清 | 五月激情片 | 国产精品欧美一区二区 | 97国内精品久久久久久久影视 | 91成人免费观看 | 国产毛片农村妇女系列 | 日本不卡免费高清一级视频 | 久久国产精品亚洲综合 | 9久久精品 | 免费看va| 欧美午夜视频一区二区三区 | 5g影院午夜伴侣 | 最新日本免费一区二区三区中文 | 美国色网站 | 热久久久久 | 狠狠色噜噜狠狠狠狠91 | 欧美日本一区二区三区 | 婷婷香蕉 | 国产产一区二区三区久久毛片国语 | 三级网址在线观看 | 久久2017| 深夜网站在线 | 日b毛片 | 免费日韩毛片 | 亚洲国产精品国产自在在线 | 男女性高爱潮免费的国产 | 天天做.天天爱.天天综合网 | 美女扒开尿口给男人看的让 | 日韩精品另类天天更新影院 | 免费看黄视频的网站 | 天堂黄网 | 亚洲 欧美 自拍 另类 欧美 | 欧美极品第1页专区 | 国产精品嫩草影院人体模特 | 奇米影视亚洲春色77777 | 成年色黄大色黄大片 视频 成年视频xxxxx免费播放软件 | 亚洲国产精品综合久久网络 | 在线观看日本亚洲一区 | 久久88色综合色鬼 |