zoukankan      html  css  js  c++  java
  • Xxl-job的使用

    Git地址:https://github.com/xuxueli/xxl-job

    详细文档:https://www.xuxueli.com/xxl-job/

    项目应用总结(修改源码支持部分成功状态):

    1.项目的pom.xml中引用xxl-job

    <!-- xxl-job-core -->
            <dependency>
                <groupId>com.xuxueli</groupId>
                <artifactId>xxl-job-core</artifactId>
            </dependency>
    

    2.添加相关配置节点

    ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
    xxl:
      job:
        admin:
          addresses: http://192.168.10.205:8091/jmgo-job-admin
        accessToken:
        executor:
          appname: tandemplatform-schedule
          address:
          ip:
          port: 9200
          logpath: /logs/
          logretentiondays: 30
    

    3.按固定入参返回值编写Job

    /**
         * 发送邮件
         */
        @XxlJob("sendVipMails")
        public ReturnT<String> sendVipMails(String param) throws Exception {
            sendMails();
            return ReturnT.SUCCESS;
        }
    

    4.记录开始结束日志

    @Aspect
    @Component
    public class XxlJoblogAop {
        @Pointcut("@annotation(com.xxl.job.core.handler.annotation.XxlJob)")
        public void xxlJoblog() {}
        //@annotation(anno) 里的必须和方法名参数名一致才可以获取到注解里的值,
        //这里目的是使用@XxlJob注解里的值,方法执行结束后从当前ThreadLocal获取是否全部成功或失败,若为false则返回部分成功
        @Around("xxlJoblog() && @annotation(anno)")
        public Object doAround(ProceedingJoinPoint pjp, XxlJob anno) {
            long st = System.currentTimeMillis();
            Object proceed = null;
            String value = anno.value();
             
            ThreadLocalUtil.set(value,ReturnT.SUCCESS);   //此处设置value为ReturnT.SUCCESS
             
            XxlJobLogger.log(value + " >>>>>---JOB START--->>>>>");
            try {
                proceed = pjp.proceed(); //执行方法
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            XxlJobLogger.log(value + " <<<<<----JOB END---<<<<<");
            XxlJobLogger.log("任务共计耗时:{}ms",System.currentTimeMillis() - st);
            ReturnT result = (ReturnT) proceed;
            //如果没有被标注为部分成功,或者方法返回FAIL,那么不改变其执行状态
            return ThreadLocalUtil.get(value,ReturnT.class)!=ReturnT.PARTITIAL_SUC ||result==ReturnT.FAIL ? proceed:ReturnT.PARTITIAL_SUC;
        }
    }
    

    5.记录每步执行的情况(报错时,同时需要使用 log.error 记录到日志里

    for (var info : infos){
    try {
    var payOrder =payOrderService.getById(info);
    JSONObject syncMesJson = new JSONObject();
    boolean syncFlag = payOrderService.syncMesPayRecord(syncMesJson);
    if(syncFlag){
    payOrderService.updateIsSyncMes(payOrder.getId());
    XxlJobLogger.log("支付成功通知MES消息重发成功,订单ID:{}",info);
    }
    else {
    XxlJobLogger.log("支付成功通知MES消息重发失败,订单ID:{}",info);
    count.getAndIncrement();
    }
    }catch (Exception ex) {
    ThreadLocalUtil.set("sendVipMails",false);
    count.getAndIncrement();
    XxlJobLogger.log("支付成功通知MES消息重发失败,订单ID:{},错误信息:{}",info,ex.getStackTrace());
    log.error("支付成功通知MES消息重发失败,订单ID:{},错误信息:{}",info,ex.getStackTrace());
    }
    }
    String result = MessageFormat.format("本次循环共【{}】条,执行异常【{}】条,成功执行【{}】条",size,count,size- count.get());
    XxlJobLogger.log(result);

    if(size>0)
    return new ReturnT(200,result);
    else
    return ReturnT.SUCCESS;
  • 相关阅读:
    VS2015安装水晶报表
    C# 通过java生成的RSA公钥加密和解密
    T4代码生成器
    产品开发- DFX
    读《31天学会CRM项目开发》记录3
    读《31天学会CRM项目开发》记录2
    读《31天学会CRM项目开发》记录1
    产品开发
    产品开发
    机器视觉
  • 原文地址:https://www.cnblogs.com/wishonline/p/14303668.html
Copyright © 2011-2022 走看看