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;
posted @ 2021-01-20 16:39  刘志斌  阅读(1296)  评论(0编辑  收藏  举报