XXL-JOB任务调度

Posted chenghao24

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XXL-JOB任务调度相关的知识,希望对你有一定的参考价值。

日常开发中难免会碰到需要开启定时任务处理业务。这时我们第一时间想到的是Spring的Task,但是很不方便,这里可以列出几点:

  1.一旦需要更改定时任务时间,我们就要打开IDE修改cron表达式;

  2.在特殊的情况下代码报错了,我们就要打开Log查看是什么导致的问题;

  3.需要很多定时任务去处理业务就要新建多个,突然不想执行这个任务了,我们就要再打开IDE注释那些代码。

 

                  就特别不好管理。

 

可能又有人要说了:

  1.我可以用Redis进行动态修改cron表达式;-------- 看下面代码!!!

  2.我写个Aop,只要出现异常了我就记录相关信息;-------- 牛掰!Aop固然好,但是你觉得真的方便了吗?

  3.······我就是不闲麻烦,咋地。-------- 打扰了!!!

 

package cn.chenghao.config;

import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import javax.annotation.PostConstruct;

/**
 * 自定义定时任务
 *
 * @Author chenghao
 * @Date 2020/4/14 11:56
 **/
@Configuration
@EnableScheduling
@AllArgsConstructor
public class CompleteScheduleConfig implements SchedulingConfigurer {

    /**
     * StringRedis模板
     */
    private final StringRedisTemplate stringRedisTemplate;

    /**
     * 初始化
     */
    @PostConstruct
    private void init() {
        // redis中不存在则创建
        stringRedisTemplate.opsForValue().setIfAbsent("cron", "0/3 * * * * ?");
    }

    /**
     * 配置任务
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        // 给定cron表达式,触发Runnable任务
        scheduledTaskRegistrar.addTriggerTask(
                () -> {
                    System.out.println("执行定时任务中.......");
                },
                triggerContext -> {
                    // 获取cron表达式
                    String cron = stringRedisTemplate.opsForValue().get("cron");
                    // 返回执行周期
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                });
    }
}

!(真的是太方便了) 

      

 

----------------------------------好,废话不再多说----------------------------------

 

XXL-JOB地址:

  Gitee:https://gitee.com/xuxueli0323/xxl-job

  GitHub:https://github.com/xuxueli/xxl-job/

  XXL社区:https://www.xuxueli.com/xxl-job/

 

概述:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

 

首先将项目clone下来后,再打开社区文档,根据文档引导先将 doc/db/tables_xxl_job.sql 脚本在自己的数据库中执行

确认无误后,再继续看文档:技术图片

 

 XXL-JOB分为三个大模块:调度中心、公共依赖、执行器

 

首先我们根据文档引导,配置调度中心

/xxl-job/xxl-job-admin/src/main/resources/application.properties

 

想想还是截个图:

技术图片

 

相应配置完成后,直接运行admin模块,浏览器输入:http://localhost:8080/xxl-job-admin     默认登录账号 admin/123456技术图片

 

刚进去这首页我还是很吃惊的!!!

技术图片

 

 

调度器配置、运行都成功了现在我们就要新建个任务看看效果了,在这之前我们还要配置执行器,也就是执行任务的容器

 

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

 

想来想去我又截了:

技术图片

 

配置好对应调度中心的信息后,我们在运行执行器

 

技术图片

 

 

运行没问题后,我们来新建个任务试试水:

技术图片

 

 

技术图片

 

我们就先用GLUE模式试试吧

技术图片

 技术图片

 

 

技术图片

 

保存完后,直接点击启动!!!

 

看控制台:

技术图片

 

看日志:

技术图片

 

任何操作一目了然!!!

 

现在我们知道了XXL-JOB的作用了,就在想怎么对接到自己的项目运行,其实想想就是将公共依赖模块移出来

 

技术图片

<!-- xxl-job 任务调度 -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.2.0</version>
        </dependency>

 

随后根据clone下来项目中的springboot版本的执行器复制 application.properties 

 

技术图片

 

package cn.running.taskdispatchdemo.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 执行器配置
 *
 * @author chenghao
 * @createTime 2020/5/21
 */
@Log
@Configuration
@ComponentScan(basePackages = "cn.running.taskdispatchdemo.handler")
public class XxlJobConfig {

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${xxl.job.executor.appname}")
    private String appName;

    @Value("${xxl.job.executor.ip}")
    private String ip;

    @Value("${xxl.job.executor.port}")
    private int port;

    @Value("${xxl.job.accessToken}")
    private String accessToken;

    @Value("${xxl.job.executor.logpath}")
    private String logPath;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean(initMethod = "start")
    public XxlJobSpringExecutor xxlJobSpringExecutor() {
        log.info("》》》》》 XXL-JOB init 《《《《《");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

}

 

 

基本配置完成后,现在调度中心新增执行器,再启动我们新建的执行器保存后,稍微等待一点时间,就自动注册上去了!!!

 

技术图片

 

在调度中心页面新增个任务:

 

技术图片

 

缺少JobHandler 需要我们去新建

package cn.running.taskdispatchdemo.handler;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 任务处理
 *
 * @author chenghao
 * @createTime 2020/5/21
 */
@Component("myHandler")
public class MyHandler {

    @XxlJob("demoJobHandler")
    public ReturnT<String> execute(String s) {
        System.out.println("任务执行成功,执行参数:" + s + "当前时间是:" + LocalDateTime.now());
        return ReturnT.SUCCESS;
    }
}

 

技术图片

 

这样就ok了,重启执行器就行了。再启动任务

 

看控制台:

技术图片

 

看日志:

技术图片

 

至此,我们再来看看首页的样子

技术图片

 

以上是关于XXL-JOB任务调度的主要内容,如果未能解决你的问题,请参考以下文章

分布式任务调度平台XXL-JOB

三分钟搞定 XXL-JOB 分布式任务调度平台

xxl-job分布式任务调度平台

XXL-Job分布式任务调度框架-- 定时任务注册案例2

XXL-Job分布式任务调度框架-- 介绍和服务搭建1

💤分布式任务调度:xxl-job