参考:

XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。一般微服务都用这个框架的定时任务吧。

下载xxl-job

首先我们要将项目下载下来

git clone https://github.com/xuxueli/xxl-job.git

下载下来之后有这几个模块,直接启动admin模块就可以进入后台了

xxl-job-admin:调度中心

xxl-job-core:公共依赖

xxl-job-executor:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用,推荐这种方式;
xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器;
xxl-job-executor-sample-jfinal:JFinal版本,通过JFinal管理执行器;
xxl-job-executor-sample-nutz:Nutz版本,通过Nutz管理执行器;

java定时任务分布式锁 定时任务 分布式_xxl-job


我就直接选择springboot的执行器了

导入脚本

将doc目录下的脚本打到数据库中

java定时任务分布式锁 定时任务 分布式_xxl-job_02

修改数据库账号密码

java定时任务分布式锁 定时任务 分布式_java_03

添加定时任务业务类

java定时任务分布式锁 定时任务 分布式_spring_04

执行器名称要对应

java定时任务分布式锁 定时任务 分布式_spring_05


在执行器管理里面添加对应的执行器管理

java定时任务分布式锁 定时任务 分布式_分布式_06


机器地址可以不用写,会自动注册。

java定时任务分布式锁 定时任务 分布式_java定时任务分布式锁_07


如果没有执行器则要新增执行器

java定时任务分布式锁 定时任务 分布式_spring_08

添加定时任务

新增定时任务

java定时任务分布式锁 定时任务 分布式_xxl-job_09


java定时任务分布式锁 定时任务 分布式_java定时任务分布式锁_10


执行一下,发现可以成功了。

java定时任务分布式锁 定时任务 分布式_xxl-job_11


java定时任务分布式锁 定时任务 分布式_java_12


OK,这样就完成了简单的启动。

项目中整合

官方的xxl-job-executor-sample-jboot其实就是我们微服务中的一个模块,因此我们可以在我们自己项目引入依赖:

<!--xxj-job核心依赖-->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

其实我就可以创建一个xxl-job的公共模块,创建一个配置类:

java定时任务分布式锁 定时任务 分布式_spring_13

public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

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

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

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

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

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

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

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

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


    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        //在項目端口的基础上向右偏移1000端口,这样可以兼容所有模块的项目
        xxlJobSpringExecutor.setPort(port+1000);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

java定时任务分布式锁 定时任务 分布式_xxl-job_14


在该模块中引入依赖:

<!--xxj-job核心依赖-->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

然后我们可以在自己的模块中引入xxl-job模块

java定时任务分布式锁 定时任务 分布式_java_15


创建一个task类就行了,引入@Xxl-job,配置一个Handler,在后台添加一下就好了。

java定时任务分布式锁 定时任务 分布式_java定时任务分布式锁_16


nacos配置:

# xxl-job
logging:
  config: classpath:logback.xml
xxl:
  job:
      accessToken: ""
      addresses: http://127.0.0.1:9207/xxl-job-admin
      address: ""
      appname: ${spring.application.name}
      ip: ""
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: 30
      port: ${server.port}

也就是在xxl-job官网文档上,我们只需要admin这个模块就行了。