哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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ì),怎能叫人不愛

jf_ro2CN3Fa ? 來源: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ì)上可以說獨(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)類中,并沒有通信相關(guān)的處理。

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

全異步處理

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

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

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

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

對(duì)異步處理進(jìn)行了包裝,代碼看起來是同步調(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 方法我們說過了,是走的動(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ì)問了,調(diào)度器接收到返回結(jié)果,怎么確定喚醒哪個(gè)線程呢?

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

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

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{
//里面調(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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6440

    瀏覽量

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

    關(guān)注

    30

    文章

    4975

    瀏覽量

    74314

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    華益精點(diǎn)亮相CMEF 慢病管理全場(chǎng)景方案驚艷煥新

    華益精點(diǎn)亮相CMEF 慢病管理全場(chǎng)景方案驚艷煥新
    的頭像 發(fā)表于 04-14 14:31 ?103次閱讀
    華益精點(diǎn)亮相CMEF 慢病管理全場(chǎng)景方案<b class='flag-5'>驚艷</b>煥新

    聚焦車載屏檢測(cè),怎能不筑牢智能汽車人機(jī)交互安全線?

    車載屏已成為智能座艙核心交互入口,黑屏、觸控失靈等問題頻發(fā)。車載屏性能檢測(cè)系統(tǒng)可全維度驗(yàn)證屏幕性能,適配車規(guī)標(biāo)準(zhǔn)。北京沃華慧通深耕該領(lǐng)域,提供定制化檢測(cè)方案,助力車企筑牢座艙安全防線,推動(dòng)智能汽車產(chǎn)業(yè)高品質(zhì)發(fā)展。
    的頭像 發(fā)表于 04-02 16:32 ?1756次閱讀
    聚焦車載屏檢測(cè),<b class='flag-5'>怎能</b>不筑牢智能汽車人機(jī)交互安全線?

    班通科技攜工業(yè)檢測(cè)方案驚艷亮相CPCA SHOW 2026,全球視野,載譽(yù)而歸!

    近日,在上海隆重舉辦的國際電子電路展覽會(huì)(CPCASHOW2026)上,作為國內(nèi)領(lǐng)先的PCB測(cè)量儀器、智能檢測(cè)設(shè)備專業(yè)解決方案供應(yīng)商,班通科技攜一系列工業(yè)級(jí)硬核解決方案驚艷亮相。以卓越的技術(shù)與創(chuàng)新
    的頭像 發(fā)表于 04-01 09:27 ?909次閱讀
    班通科技攜工業(yè)檢測(cè)方案<b class='flag-5'>驚艷</b>亮相CPCA SHOW 2026,全球視野,載譽(yù)而歸!

    官方fedroa鏡像無法進(jìn)系統(tǒng)怎么解決?

    今天下午收到了板子,按照 VisionFive Quick Start Guide 弄好micro sd卡,上電后無法正常進(jìn)系統(tǒng),最后卡在 A start job is running
    發(fā)表于 03-30 07:41

    中科曙光萬卡超集群為“人工智能+”提供底層動(dòng)力

    馬年春晚,人工智能技術(shù)的多元?jiǎng)?chuàng)新應(yīng)用驚艷全國觀眾,盡顯科技與文化融合的時(shí)代風(fēng)采;春節(jié)過后,各地“新春第一會(huì)”相繼召開,人工智能成為高頻關(guān)鍵詞。
    的頭像 發(fā)表于 03-04 14:15 ?472次閱讀

    MangoTree新品劇透(2):既然有最強(qiáng)CPU,我們怎能不用在PXI上?!!

    cpu
    芒果樹數(shù)字
    發(fā)布于 :2026年02月13日 14:15:09

    客戶案例分享 | 柔性屏廣告機(jī)背后功臣,防水高速不松脫就看這款連接器

    直屏廣告看多了,視覺疲勞柔性屏一亮相,給人驚艷貼合墻面渾然天成玲瓏多變?cè)煨筒环沧審V告更有沉浸感柔性屏廣告機(jī)在驚艷視覺效果時(shí),其背后這個(gè)角色不容小覷,它就是提供高速數(shù)據(jù)傳輸?shù)墓I(yè)級(jí)USB數(shù)據(jù)連接器。1
    的頭像 發(fā)表于 01-06 18:46 ?344次閱讀
    客戶案例分享 | 柔性屏廣告機(jī)背后功臣,防水高速不松脫就看這款連接器

    激情全運(yùn)會(huì)怎能少了嵌入式這種技術(shù)型選手,快來一起圍觀吧!#核心板 #嵌入式開發(fā)

    數(shù)據(jù)采集核心板
    ZLG致遠(yuǎn)電子
    發(fā)布于 :2025年12月23日 14:11:45

    【匠芯創(chuàng)D133CBS KunLun Pi開發(fā)板試用體驗(yàn)】《匠芯創(chuàng)D133CBS RISC-V KunLun Pi 》 開箱及搭建vscode開發(fā)環(huán)境

    一、開箱概覽 包裝內(nèi)容 打開包裹:匠芯創(chuàng)D133CBS開發(fā)板 x1 板子的做工也是相當(dāng)不錯(cuò),驚艷我了,接口非常多,還有觸摸屏,同時(shí)還可以接DVP攝像頭,喇叭,TF卡等重要外設(shè) 初步檢查 二:.外觀
    發(fā)表于 09-04 22:33

    K&apos;s TOUR 2025 | 科士達(dá)閃耀卡拉奇,再譜巴鐵光儲(chǔ)新篇

    當(dāng)?shù)貢r(shí)間8月18日,K'sTOUR2025卡拉奇站圓滿落幕,這是繼年初首秀后,科士達(dá)再度以創(chuàng)新實(shí)力亮相巴基斯坦市場(chǎng)?;顒?dòng)現(xiàn)場(chǎng),科士達(dá)攜全場(chǎng)景光儲(chǔ)解決方案矩陣驚艷亮相,并與當(dāng)?shù)囟嗉掖砩毯炇?/div>
    的頭像 發(fā)表于 08-19 17:02 ?1008次閱讀
    K&apos;s TOUR 2025 | 科士達(dá)閃耀卡拉奇,再譜巴鐵光儲(chǔ)新篇

    100V耐壓80V60V48V降壓12V5V3.3V/3A大電流車載音響驅(qū)動(dòng)H6216L

    :≥3.3V。 電壓精度:±3.5%。 結(jié)合惠海半導(dǎo)體同系列芯片 H6215L 以及電子發(fā)燒友網(wǎng)對(duì) H62XXL 系列芯片的介紹可知,H6216L 可能還具有以下特性: 輸入電壓范圍:屬于 H62XXL
    發(fā)表于 07-23 11:36

    docker無法啟用怎么解決?

    mengxing@mengxing-virtual-machine:/etc/docker$ sudo systemctl restart docker Job for docker.service failed because
    發(fā)表于 06-23 07:17

    長電科技榮膺2025年度大學(xué)生喜愛的雇主品牌

    近日,長電科技憑借在應(yīng)屆生招聘、培養(yǎng)與發(fā)展方面的卓越實(shí)踐和持續(xù)投入,從眾多優(yōu)秀企業(yè)中脫穎而出,入選由中國領(lǐng)先的人力資源服務(wù)商前程無憂(51job.com)公布的“2025年度大學(xué)生喜愛的雇主品牌”榜單。
    的頭像 發(fā)表于 06-20 16:23 ?1094次閱讀

    從 “人工苦力”到 “智能戰(zhàn)神”,請(qǐng)看番茄采摘的進(jìn)化史

    以前摘番茄全靠人工,累人還費(fèi)錢,年輕人都不愛干這活兒?,F(xiàn)在農(nóng)業(yè)界直接放大招——番茄采摘機(jī)器人橫空出世!這機(jī)器人超牛,分采摘和底盤兩部分。采摘系統(tǒng)有“神器三件套”:機(jī)械臂像八爪魚,靈活抓番茄;末端手比
    的頭像 發(fā)表于 05-26 01:30 ?1483次閱讀
    從 “人工苦力”到 “智能戰(zhàn)神”,請(qǐng)看番茄采摘的進(jìn)化史

    vivo X200 Ultra與瑞聲科技首發(fā)WLG超光棱鏡

    近日,vivo發(fā)布會(huì)上,有“V單”之稱的vivo X200 Ultra驚艷亮相,開拓更多的移動(dòng)影像可能性!
    的頭像 發(fā)表于 04-25 11:33 ?1786次閱讀
    罗平县| 西昌市| 紫阳县| 普宁市| 太康县| 汽车| 营山县| 句容市| 卢龙县| 马山县| 巴里| 大姚县| 东方市| 曲沃县| 黄冈市| 玛多县| 浦江县| 江北区| 宜川县| 潜山县| 中方县| 尖扎县| 乌海市| 马鞍山市| 收藏| 长春市| 通山县| 阳西县| 修文县| 志丹县| 新宾| 出国| 鄂托克前旗| 镇原县| 中宁县| 博湖县| 时尚| 潞城市| 灌云县| 怀远县| 兰西县|