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(timeout< 0){
//线程阻塞
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

    文章

    6493

    浏览量

    140393
  • 代码
    +关注

    关注

    30

    文章

    4985

    浏览量

    74590

原文标题:xxl-job惊艳的设计,怎能叫人不爱

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    虹科具身智能全栈解决方案:从Demo到量产的工程落地指南

    引言:具身智能的复杂性在于“大脑”与“身体”的协同。大模型提供了强大的认知,但物理世界的交互、实时响应和工程可靠性,仍是横亘在"惊艳Demo"与"可靠量产"
    的头像 发表于 05-28 17:05 770次阅读
    虹科具身智能全栈解决方案:从Demo到量产的工程落地指南

    聚力高博 智启新程|小眼睛科技携多款核心产品方案惊艳亮相64届中国高等教育博览会

    高质量发展新路径。小眼睛科技携新一代人工智能及新工科工程教育实验平台解决方案惊艳亮相,以硬核实力与创新成果,交出亮眼答卷!01小眼睛科技多款核心实训方案·重磅亮相在端
    的头像 发表于 05-27 08:04 105次阅读
    聚力高博 智启新程|小眼睛科技携多款核心产品方案<b class='flag-5'>惊艳</b>亮相64届中国高等教育博览会

    新版分布式调度XXL-Job+SpringBoot2.X-IT爱学堂(搜aixuetang-xyz)

    互联网
    jf_30522741
    发布于 :2026年05月19日 18:25:47

    福禄克5530A基本型多产品校准器在光伏储能电站运维中的应用

    的准确性。试想,若电站的“眼睛”——各类电学仪表——出现偏差,我们又怎能准确判断设备状态?如何科学决策能源调度?今天,就让我们聚焦光伏储能电站运维中一项基础却关键的工作:电学仪表的维护与校准,揭秘如何让每一组数据都真实可靠。
    的头像 发表于 04-27 10:06 3192次阅读
    福禄克5530A基本型多产品校准器在光伏储能电站运维中的应用

    华益精点亮相CMEF 慢病管理全场景方案惊艳焕新

    华益精点亮相CMEF 慢病管理全场景方案惊艳焕新
    的头像 发表于 04-14 14:31 251次阅读
    华益精点亮相CMEF 慢病管理全场景方案<b class='flag-5'>惊艳</b>焕新

    聚焦车载屏检测,怎能不筑牢智能汽车人机交互安全线?

    车载屏已成为智能座舱核心交互入口,黑屏、触控失灵等问题频发。车载屏性能检测系统可全维度验证屏幕性能,适配车规标准。北京沃华慧通深耕该领域,提供定制化检测方案,助力车企筑牢座舱安全防线,推动智能汽车产业高品质发展。
    的头像 发表于 04-02 16:32 1924次阅读
    聚焦车载屏检测,<b class='flag-5'>怎能</b>不筑牢智能汽车人机交互安全线?

    班通科技携工业检测方案惊艳亮相CPCA SHOW 2026,全球视野,载誉而归!

    近日,在上海隆重举办的国际电子电路展览会(CPCASHOW2026)上,作为国内领先的PCB测量仪器、智能检测设备专业解决方案供应商,班通科技携一系列工业级硬核解决方案惊艳亮相。以卓越的技术与创新
    的头像 发表于 04-01 09:27 1438次阅读
    班通科技携工业检测方案<b class='flag-5'>惊艳</b>亮相CPCA SHOW 2026,全球视野,载誉而归!

    官方fedroa镜像无法进系统怎么解决?

    今天下午收到了板子,按照 VisionFive Quick Start Guide 弄好micro sd卡,上电后无法正常进系统,最后卡在 A start job is running
    发表于 03-30 07:41

    中科曙光万卡超集群为“人工智能+”提供底层动力

    马年春晚,人工智能技术的多元创新应用惊艳全国观众,尽显科技与文化融合的时代风采;春节过后,各地“新春第一会”相继召开,人工智能成为高频关键词。
    的头像 发表于 03-04 14:15 595次阅读

    MangoTree新品剧透(2):既然有最强CPU,我们怎能不用在PXI上?!!

    cpu
    芒果树数字
    发布于 :2026年02月13日 14:15:09

    客户案例分享 | 柔性屏广告机背后功臣,防水高速不松脱就看这款连接器

    直屏广告看多了,视觉疲劳柔性屏一亮相,给人惊艳贴合墙面浑然天成玲珑多变造型不凡让广告更有沉浸感柔性屏广告机在惊艳视觉效果时,其背后这个角色不容小觑,它就是提供高速数据传输的工业级USB数据连接器。1
    的头像 发表于 01-06 18:46 418次阅读
    客户案例分享 | 柔性屏广告机背后功臣,防水高速不松脱就看这款连接器

    K&apos;s TOUR 2025 | 科士达闪耀卡拉奇,再谱巴铁光储新篇

    当地时间8月18日,K'sTOUR2025卡拉奇站圆满落幕,这是继年初首秀后,科士达再度以创新实力亮相巴基斯坦市场。活动现场,科士达携全场景光储解决方案矩阵惊艳亮相,并与当地多家代理商签署
    的头像 发表于 08-19 17:02 1100次阅读
    K&apos;s TOUR 2025 | 科士达闪耀卡拉奇,再谱巴铁光储新篇

    100V耐压80V60V48V降压12V5V3.3V/3A大电流车载音响驱动H6216L

    :≥3.3V。 电压精度:±3.5%。 结合惠海半导体同系列芯片 H6215L 以及电子发烧友网对 H62XXL 系列芯片的介绍可知,H6216L 可能还具有以下特性: 输入电压范围:属于 H62XXL
    发表于 07-23 11:36

    docker无法启用怎么解决?

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

    长电科技荣膺2025年度大学生喜爱的雇主品牌

    近日,长电科技凭借在应届生招聘、培养与发展方面的卓越实践和持续投入,从众多优秀企业中脱颖而出,入选由中国领先的人力资源服务商前程无忧(51job.com)公布的“2025年度大学生喜爱的雇主品牌”榜单。
    的头像 发表于 06-20 16:23 1204次阅读