如何通过编码的方式手动触发xxl-job执行器

前言

xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。我部门大部分定时任务调度都是基于xxl-job,诸如报表统计、定时数据同步等。
今天的素材来源于某天产品经理想在定时同步报表数据的基础上,再增加一个手动触发报表数据同步的功能。即在报表页面上新增一个手动同步的按钮,触发该按钮就可以执行报表数据同步

需求分析

1、保留定时同步功能,同时新增手动同步

2、手动同步的数据产生的效果要和定时数据同步的产生效果一样

解决思路

1、方案一、新建一个手动调用的controller,controller触发数据同步逻辑service

其实就是把写在xxl-job执行器里面的同步逻辑,再放到controller执行一遍

2、方案二、新建一个手动调用的controller,在controller里面直接触发xxl-job执行器

解决方案分析

在原先的定时器场景,我们为了避免定时器里面的同步逻辑还没完成,下次定时器就触发导致数据同步不准确,我们在执行器里面做一些手段进行规避,比如设置同步完成标志位等。
如果基于方案一,方案看似可行,其实存在潜在的坑点。即定时器执行的时候,手动刚好触发执行,或者反过来,手动触发的时候,定时器也执行了。这样就会导致数据同步执行多次,导致数据不准确。

后面我们调研了xxl-job,看到了xxl-job有提供restful风格触发执行器的功能,这个功能简直就是为我们量身定做,当手动调用的时候,触发执行器,因为执行的是执行器里面的调用逻辑,因此就会触发我们为避免数据同步不准确所采取的手段

如何通过restful风格手动触发xxl-job执行器执行

其具体介绍可以查看官网,其链接如下

https://www.xuxueli.com/xxl-job/#6.2 执行器 RESTful API

本例的核心代码块

@RestController
@RequestMapping(value = "xxl-job")
@Api(tags = "xxl-job restful调度")
@Profile("job")
@Slf4j
public class XxlJobController {

    @Autowired
    private XxljobClientHelper xxljobClientHelper;

    @ApiOperation(value = "手动触发任务")
    @GetMapping("/run")
    public AjaxResult execute(){
        String adminClientAddressUrl = xxljobClientHelper.getAdminClientAddressUrl();
        String accessToken = xxljobClientHelper.getAccessToken();
        log.info("adminClientAddressUrl:{},accessToken:{}", adminClientAddressUrl,accessToken);
        ExecutorBiz executorBiz = new ExecutorBizClient(adminClientAddressUrl, accessToken);
        ReturnT<String> retval = executorBiz.run(getTriggerParam());
        log.info("retval:{}", JSON.toJSONString(retval));
         // 200 表示正常、其他失败
        if(retval.getCode() == 200){
            return AjaxResult.success();
        }
        return AjaxResult.error(retval.getMsg(),retval.getCode());
    }

    private TriggerParam getTriggerParam(){
        TriggerParam triggerParam = new TriggerParam();
        // 任务ID
//        triggerParam.setJobId(15);
        // 任务标识
        triggerParam.setExecutorHandler("demoJobHandler");
        // 任务参数
        triggerParam.setExecutorParams("手动触发任务");
        // 任务阻塞策略,可选值参考 com.xxl.job.core.enums.ExecutorBlockStrategyEnum
        triggerParam.setExecutorBlockStrategy(ExecutorBlockStrategyEnum.COVER_EARLY.name());
        // 任务模式,可选值参考 com.xxl.job.core.glue.GlueTypeEnum
        triggerParam.setGlueType(GlueTypeEnum.BEAN.name());
        // GLUE脚本代码
        triggerParam.setGlueSource(null);
        // GLUE脚本更新时间,用于判定脚本是否变更以及是否需要刷新
        triggerParam.setGlueUpdatetime(System.currentTimeMillis());
        // 本次调度日志ID
        triggerParam.setLogId(triggerParam.getJobId());
        // 本次调度日志时间
        triggerParam.setLogDateTime(System.currentTimeMillis());
        return triggerParam;

    }
}

注: 代码中的demoJobHandler,就是执行器里面的调度方法。形如下

  /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
        System.out.println("======================param:"+param+"================================随机数:"+new Random().nextInt(1000));
        return ReturnT.SUCCESS;
    }

总结

如果选用方案一,也不是不行,就还得做一些改造,比如增加全局标志位,而且在设置标志位的时候,还要考虑并发场景下,可能出现的问题。因此还不如直接采用方案二。方案的选择一定得要基于业务场景进行考量,不基于业务场景,谈技术方案,很容易采坑

demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-xxl-job-executor

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
XXL-Job执行器XXL-Job分布式任务调度平台中的一个核心组件,负责接收和执行调度中心发送的任务执行器可以独立部署在各个执行节点上,通过与调度中心进行通信,实现任务的调度和执行。 XXL-Job执行器提供了丰富的功能和接口,主要包括以下几个方面: 1. 任务执行:执行器接收到调度中心发送的任务后,负责根据任务类型进行相应的执行。XXL-Job支持多种任务类型,如Shell任务Java任务、Python任务等,执行器会根据任务类型来执行相应的逻辑。 2. 任务参数传递:执行器可以接收调度中心传递的任务参数,并将参数传递给具体的任务执行逻辑。任务参数可以在任务配置中进行设置,执行器会根据配置将参数传递给任务。 3. 任务结果回调:执行器任务执行完成后,会将任务执行结果回调给调度中心。调度中心可以根据任务执行结果进行相应的处理,如记录日志、发送通知等。 4. 心跳检测:执行器会定期向调度中心发送心跳信息,用于告知调度中心自身的存活状态和可用性。调度中心可以通过心跳检测来监控执行器的健康状态。 5. 日志上报:执行器会将任务执行过程中的日志上报给调度中心,便于开发者查看任务的日志输出和排查问题。 XXL-Job执行器可以根据实际需求进行灵活的部署和配置,可以实现任务的并发执行和负载均衡,提高任务执行的效率和可靠性。同时,执行器还提供了可扩展的接口,可以与其他系统进行集成,满足更复杂的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值