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

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

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

3天內不再提示

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

jf_ro2CN3Fa ? 來源:c1n.cn/N8Mln ? 2022-12-22 14:43 ? 次閱讀

  • 通信底層介紹
  • 通信整體流程
  • 驚艷的設計

通信底層介紹

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

通信整體流程

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

cafb50e6-81b9-11ed-8abf-dac502259ad0.png活動圖

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

驚艷的設計

看完了整個處理流程代碼,設計上可以說獨具匠心,將 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(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;
}

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

每一次遠程調用,都會生成 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);

}


審核編輯 :李倩


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

    關注

    18

    文章

    6043

    瀏覽量

    136172
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68763

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

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

收藏 人收藏

    評論

    相關推薦

    在 Flexus X 上部署 ELK 日志系統

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

    基于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>任務調度平臺

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

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

    聯誠發LED屏驚艷亮相土耳其廣告展

    近日,第25屆國際廣告業和數字印刷技術博覽會(簡稱 Sign Istanbul )在土耳其伊斯坦布爾隆重舉行。聯誠發攜多款創新LED顯示產品及多領域的應用解決方案驚艷亮相,為全球客戶打造沉浸式視覺盛宴,展會現場人流絡繹不絕,熱鬧非凡。
    的頭像 發表于 11-04 17:47 ?431次閱讀

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

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

    北京安防博覽會圓滿閉幕!華電子智慧路燈全網運維管理驚艷全場!

    北京安防博覽會圓滿閉幕!華電子智慧路燈全網運維管理驚艷全場!
    的頭像 發表于 10-28 10:32 ?210次閱讀
    北京安防博覽會圓滿閉幕!華電子智慧路燈全網運維管理<b class='flag-5'>驚艷</b>全場!

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

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

    智動未來!廣和通AI解決方案驚艷2024世界機器人大會

    8月21-25日,2024世界機器人大會在北京經開區北人亦創國際會展中心順利開幕,廣和通攜一系列端側AI產品及解決方案驚艷亮相A館A167展位,與產業伙伴探討“機器人+”應用場景與AI技術,攜手推進機器人領域的創新合作。
    的頭像 發表于 08-22 10:57 ?594次閱讀
    智動未來!廣和通AI解決方案<b class='flag-5'>驚艷</b>2024世界機器人大會

    未來的智慧園區,充滿令人驚艷的場景

    未來的智慧園區,充滿了令人驚艷的場景。它將實現從能源管理到環境監測的多重使命,用科技的力量為人類打造宜居、綠色的工作生活空間。 首先,智慧園區的能源管理將進入全新階段。通過智能化的能源管理系統,實時
    的頭像 發表于 05-08 15:33 ?306次閱讀

    不容忽視的PCB設計細節

    比起低價壓力、緊迫交期、嚴苛品質、貨款拖延等常規煩惱,訂單里那些不起眼的設計失誤和小BUG,帶來的影響更叫人腦殼疼!
    發表于 04-10 11:46 ?411次閱讀
    不容忽視的PCB設計細節

    哪吒汽車攜暢銷車型NETA V-II驚艷亮相曼谷國際車展

    哪吒汽車攜暢銷車型NETA V-II驚艷亮相曼谷國際車展
    的頭像 發表于 03-28 10:11 ?410次閱讀
    哪吒汽車攜暢銷車型NETA V-II<b class='flag-5'>驚艷</b>亮相曼谷國際車展

    京東方攜前沿顯示技術驚艷亮相MWC 2024

    2月26日至29日,備受全球矚目的世界移動通信大會(MWC2024)在西班牙巴塞羅那盛大開幕。此次盛會,BOE(京東方)攜手多家全球一線品牌合作伙伴驚艷亮相,帶來了搭載其柔性OLED、3D顯示、VR顯示等尖端顯示技術的10余款創新消費電子產品,包括手機、平板、筆記本電腦和顯示器等。
    的頭像 發表于 03-03 15:51 ?1256次閱讀

    TC397寄存器DMU_HF_ECCS保留位不為0引發報錯MEMIF_JOB_FAILED的原因?

    在dflash模塊中做讀日志動作時寄存器DMU_HF_ECCS保留位不為0引發報錯MEMIF_JOB_FAILED
    發表于 02-04 07:13

    使能TC2xxL MCU的 SMU_FSP引腳,對應的SMU驅動如何配置呢?

    我想使能 TC2xxL MCU的 SMU_FSP引腳,對應的SMU驅動如何配置呢?比如SmuAlarmGroup里怎么配置
    發表于 02-04 06:00

    xxl-job通信設計流程

    每一次遠程調用,都會生成 uuid 的請求 id,這個 id 是在整個調用過程中一直傳遞的,就像一把鑰匙,在你回家的的時候,拿著它就帶開門。
    的頭像 發表于 01-30 09:34 ?662次閱讀
    <b class='flag-5'>xxl-job</b>通信設計流程
    主站蜘蛛池模板: 四虎影院国产| 亚洲天天在线| 上色天天综合网| 久久久免费网站| 四虎国产永久免费久久| 天堂电影免费在线资源| 国产精品久久久久久久久久妇女 | 欧美图片小说视频| 欧美videosex性欧美成人| 国产精品久久久久久吹潮| 老师您的兔子好软水好多动漫视频 | 午夜影院在线看| 久久美女视频| 韩国三级无遮挡床戏视频| 欧美日韩一区视频| 色婷五月| 综合网在线| 26uuu影院亚洲欧美综合| 欧美tube44videos| 国产亚洲精品美女2020久久| 色综合久久88色综合天天| 黄色免费看网站| 人人干人人爽| 手机免费看大片| 天天干天天狠| 天天干网| 一级黄色片a| 国模吧新入口| 国产毛片农村妇女aa板| 国产精品大尺度尺度视频| 国产在线观看网址你懂得| 11111日本网站| 亚洲免费一级视频| 国产美女一级片| 67194最新网址| 5566精品资源在线播放| 特黄aaaaaa久久片| 狠狠色噜噜狠狠狠狠五月婷| 九九久久久久午夜精选| 天堂在线中文字幕| 国产性色视频|