<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      盤一盤 XXL-JOB 中那些驚艷的架構設計

      0
      分享至

      Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎、并發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!

      1、通信底層介紹

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

      2、通信整體流程

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


      3、驚艷的設計

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

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

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

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

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

      全異步處理

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

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

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

      對異步處理的包裝

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

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

      public static ReturnT 
      
         
      runExecutor(TriggerParam triggerParam, String address){
      ReturnT runResult = null;
      try {
      ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
      //這里面做了很多異步處理,最終同步得到處理結果
      runResult = executorBiz.run(triggerParam);
      } catch (Exception e) {
      logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e);
      runResult = new ReturnT (ReturnT.FAIL_CODE, ThrowableUtil.toString(e));
      }

      StringBuffer runResultSB = new StringBuffer(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());
      return runResult;
      }

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

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

      動態代理代碼如下:

      //代理類中的觸發調用
      if (CallType.SYNC == callType) {
      // future-response set
      XxlRpcFutureResponse futureResponse = new XxlRpcFutureResponse(invokerFactory, xxlRpcRequest, null);
      try {
      // do invoke
      client.asyncSend(finalAddress, xxlRpcRequest);

      // future get
      XxlRpcResponse xxlRpcResponse = futureResponse.get(timeout, TimeUnit.MILLISECONDS);
      if (xxlRpcResponse.getErrorMsg() != null) {
      thrownew XxlRpcException(xxlRpcResponse.getErrorMsg());
      }
      return xxlRpcResponse.getResult();
      } catch (Exception e) {
      logger.info(">>>>>>>>>>> xxl-rpc, invoke error, address:{}, XxlRpcRequest{}", finalAddress, xxlRpcRequest);

      throw (e instanceof XxlRpcException)?e:new XxlRpcException(e);
      } finally{
      // future-response remove
      futureResponse.removeInvokerFuture();
      }
      }

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

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

      @Override
      public XxlRpcResponse get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
      if (!done) {
      synchronized (lock) {
      try {
      if (timeout < 0) {
      //線程阻塞
      lock.wait();
      } else {
      long timeoutMillis = (TimeUnit.MILLISECONDS==unit)?timeout:TimeUnit.MILLISECONDS.convert(timeout , unit);
      lock.wait(timeoutMillis);
      }
      } catch (InterruptedException e) {
      throw e;
      }
      }
      }

      if (!done) {
      thrownew XxlRpcException("xxl-rpc, request timeout at:"+ System.currentTimeMillis() +", request:" + request.toString());
      }
      return response;
      }

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

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

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

      public void notifyInvokerFuture(String requestId, final XxlRpcResponse xxlRpcResponse){

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

      // callback type
      try {
      executeResponseCallback(new Runnable() {
      @Override
      public void run() {
      if (xxlRpcResponse.getErrorMsg() != null) {
      futureResponse.getInvokeCallback().onFailure(new XxlRpcException(xxlRpcResponse.getErrorMsg()));
      } else {
      futureResponse.getInvokeCallback().onSuccess(xxlRpcResponse.getResult());
      }
      }
      });
      }catch (Exception e) {
      logger.error(e.getMessage(), e);
      }
      } else {
      // 里面調用lock的notify方法
      futureResponse.setResponse(xxlRpcResponse);
      }

      // do remove
      futureResponsePool.remove(requestId);

      }

      來源:https://blog.csdn.net/weixin_45334346?type=blog

      公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!

      最近有很多人問,有沒有讀者或者摸魚交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!

      文章有幫助的話,點在看,轉發吧!

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      歐洲傻眼了!你敢凍我2290億?好!我直接“合法抄家”2300億。

      歐洲傻眼了!你敢凍我2290億?好!我直接“合法抄家”2300億。

      忠于法紀
      2025-12-20 10:20:04
      3-0,哈蘭德2球1助攻,曼城豪取7連勝+升至英超榜首,阿森納怕不

      3-0,哈蘭德2球1助攻,曼城豪取7連勝+升至英超榜首,阿森納怕不

      側身凌空斬
      2025-12-21 00:51:49
      深圳16歲“烤雞少年”回應日營業額過萬:利潤約一到兩千,若重來想好好讀書

      深圳16歲“烤雞少年”回應日營業額過萬:利潤約一到兩千,若重來想好好讀書

      紅星新聞
      2025-12-20 19:39:12
      看似瘦弱的林熙蕾為什么魅力四射,主要幾點原因?

      看似瘦弱的林熙蕾為什么魅力四射,主要幾點原因?

      凡知
      2025-12-20 20:31:49
      震驚!有茅臺經銷商單批出貨虧損超30萬,網傳浙江有黃牛開始掃樓

      震驚!有茅臺經銷商單批出貨虧損超30萬,網傳浙江有黃牛開始掃樓

      火山詩話
      2025-12-20 12:02:08
      退休后,不要在熟人面前有8種行為, 誰看誰受益,建議收藏

      退休后,不要在熟人面前有8種行為, 誰看誰受益,建議收藏

      情感大使館
      2025-12-16 14:07:41
      當年斥巨資拍攝的10大爛片,每一部都是電影界的奇恥大辱

      當年斥巨資拍攝的10大爛片,每一部都是電影界的奇恥大辱

      小微看電影
      2025-12-19 09:35:41
      烏克蘭一夜摧毀克里米亞的米格31戰機!打掉4套防空系統

      烏克蘭一夜摧毀克里米亞的米格31戰機!打掉4套防空系統

      項鵬飛
      2025-12-19 16:41:29
      35歲少婦賣淫:現場89個道具畫面流出,正面照曝光,骯臟細節披露

      35歲少婦賣淫:現場89個道具畫面流出,正面照曝光,骯臟細節披露

      博士觀察
      2025-12-20 16:36:18
      還沒打委內瑞拉,美先炸第3國,美軍不宣而戰,100枚導彈連夜空襲

      還沒打委內瑞拉,美先炸第3國,美軍不宣而戰,100枚導彈連夜空襲

      時時有聊
      2025-12-20 20:43:34
      委內瑞拉油輪剛出海,中國軍艦緊隨其后,特朗普的算盤又打錯了

      委內瑞拉油輪剛出海,中國軍艦緊隨其后,特朗普的算盤又打錯了

      觸摸史跡
      2025-12-20 11:27:41
      大量網友相信強力磁鐵可讓燃氣表變慢,專家:竊氣嚴重可刑事處罰

      大量網友相信強力磁鐵可讓燃氣表變慢,專家:竊氣嚴重可刑事處罰

      映射生活的身影
      2025-12-20 03:39:27
      演員林峯談自己“撞臉”兵馬俑:我都有點嚇到;此前有游客拍到一尊彩面陶俑神似林峯

      演員林峯談自己“撞臉”兵馬俑:我都有點嚇到;此前有游客拍到一尊彩面陶俑神似林峯

      草莓解說體育
      2025-12-21 00:54:07
      1980年,65歲開國中將出獄后看望老首長,徐向前竟怒斥:我不見他

      1980年,65歲開國中將出獄后看望老首長,徐向前竟怒斥:我不見他

      興趣知識
      2025-12-21 01:01:50
      張本智和錯誤言論曝光!日本留學生:他不是中國人,別對他有期望

      張本智和錯誤言論曝光!日本留學生:他不是中國人,別對他有期望

      念洲
      2025-12-20 07:29:33
      泰軍宣布重創柬埔寨!繳獲大批中國造導彈!打到洪森父子投降?

      泰軍宣布重創柬埔寨!繳獲大批中國造導彈!打到洪森父子投降?

      深度報
      2025-12-17 23:06:04
      又老又丑,連普通話都說不好,為何能讓千億富豪對她情有獨鐘?

      又老又丑,連普通話都說不好,為何能讓千億富豪對她情有獨鐘?

      素衣讀史
      2025-12-20 16:26:36
      “難怪口感怪怪的……”必勝客門店被查!羅永浩發聲

      “難怪口感怪怪的……”必勝客門店被查!羅永浩發聲

      都市快報橙柿互動
      2025-12-20 11:32:06
      美媒曾公開全球最差的7艘航母:遼寧艦上榜,福建艦和山東艦呢?

      美媒曾公開全球最差的7艘航母:遼寧艦上榜,福建艦和山東艦呢?

      策略述
      2025-12-20 13:26:47
      香港人氣歌手湛江開唱,高價票遇冷被迫打折出售,已購票粉絲不滿

      香港人氣歌手湛江開唱,高價票遇冷被迫打折出售,已購票粉絲不滿

      陌識
      2025-12-19 17:28:05
      2025-12-21 03:35:00
      Java精選
      Java精選
      一場永遠也演不完的戲
      1764文章數 3859關注度
      往期回顧 全部

      科技要聞

      許四清:具身智能的"ChatGPT時刻"還未到來

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      體育要聞

      我開了20年大巴,現在是一名西甲主帥

      娛樂要聞

      2026央視跨年晚會陣容曝光,豪華陣仗

      財經要聞

      求解“地方財政困難”

      汽車要聞

      嵐圖推進L3量產測試 已完成11萬公里實際道路驗證

      態度原創

      本地
      教育
      手機
      房產
      軍事航空

      本地新聞

      云游安徽|訪黃山云海古村,讀一城山水風骨

      教育要聞

      別逼孩子死磕高二數學了!我用3個“懶方法”,讓倒數娃沖進前20

      手機要聞

      vivo X200T再曝,天璣 9400+芯片加持

      房產要聞

      廣州有態度,一座國際化社區給出的城市答案

      軍事要聞

      澤連斯基:前線局勢愈發艱難

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 大胸美女被吃奶爽死视频| 一道本AV免费不卡播放| 无套内谢少妇毛片aaaa片免费 | 无码h| 成人视频AAA| 国产成人?亚洲?日韩| 久久99国产乱子伦精品免费| 欧美粗大猛烈老熟妇| 无码伊人久久大杳蕉中文无码| 无码无码无码| 97无码精品人妻免費一区二区| 精品综合久久久久久98| 国产亚洲一二三区精品| 最新在线中文字幕| 商都县| 国产日韩欧美| 国产成人AV| 日韩精品人妻| 天天躁夜夜躁狠狠躁AV| 国产又大又黑又粗免费视频| 国产精品久久久久久无毒不卡| 少妇无码| 久久天天躁狠狠躁夜夜av| 丁香婷婷激情综合俺也去| 国产亚洲精品久久久久久大师 | 亚洲精品国产AV| 亚洲国产精品久久久天堂麻豆宅男| 无码人妻AⅤ一区二区三区A片一 | 丝袜shi在线播放| 内射自拍| 免费国偷自产拍精品视频| 国产在线线精品宅男网址| 在线播放日韩一区| 精品一区二区av天堂| 无码人妻精品一区二区三区久久久| 久久国产AV| 淅川县| 亚洲综合国产一区二区三区| 最新日韩精品视频在线| 在线免费看AV| 亚洲av电影天堂网|