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

1.因为在服务中写定时任务,当服务发布多份实例时,会多次执行,可能造业务数据混乱,把定时任务执行次数分离出来,由分布式任务调度平台去控制
2.本篇将介绍 xxl-job

  • 官网地址:https://www.xuxueli.com/xxl-job
  • Github:https://github.com/xuxueli/xxl-job/

3.概要说明,xxl-job的工作原理

  • 1.部署xxl-job服务端,由该服务端控制业务服务里面的定时任务执行次数和时间
  • 2.在业务服务中引入xxl-job客户端依赖,指定xxl-job服务端的地址,相当于向服务端注册本服务的IP+PORT,这样xxl-job服务端才能调用业务服务里面的定时任务
  • 3.在xxl-job服务端提供的Web管理后台控制任务执行时间

以上是我对xxl-job的理解,具体请参考官网文档

4.部署xxl-job服务端,将采用docker部署
xxl-job需要mysql数据库存储任务配置信息,因此需要先把数据库和表数据初始化好,官网提供了脚步
https://github.com/xuxueli/xxl-job/blob/master/doc/db/tables_xxl_job.sql

#配置好mysql地址和账户信息,把日志信息映射到宿主机
docker run -it -d -e PARAMS="--spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456" \
-v /root/xxl-job/data/applogs:/data/applogs \
--name xxl-job-admin \
-p 8080:8080 \
--network=host xuxueli/xxl-job-admin:2.2.0

启动好后访问: localhost:8080/xxl-job-admin/ (要带 /xxl-job-admin 路径),默认 admin 123456
分布式任务调度平台xxl-job初使用_第1张图片
分布式任务调度平台xxl-job初使用_第2张图片
5.客户端业务服务SpringBoot,写定时任务

  • 1.引入xxl-job-core
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.2.0</version>
</dependency>
  • 2.application.yml配置 xxl-job 服务端信息
xxl:
  job:
    accessToken:
    admin: 
      addresses: http://192.168.6.1:8080/xxl-job-admin
    executor:
      appname: mobile-job
      ip:
      port: 9997
      logpath: /data/applogs/xxl-job/jobhandler
      logretentiondays: -1
      address:
  • 3.配置xxl-job bean
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @Value("${xxl.job.accessToken}")
    private String accessToken;
    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Value("${xxl.job.executor.address}")
    private String address;
    @Value("${xxl.job.executor.ip}")
    private String ip;
    @Value("${xxl.job.executor.port}")
    private int port;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;
    @Autowired
    private InetUtils inetUtils;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        String ipAddress = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
        logger.info(">>>>>>>>>>> xxl-job config init.");
        logger.info(">>>>>>>>>>>appname:{}", appname);
        logger.info(">>>>>>>>>>>adminAddresses:{}", adminAddresses);
        logger.info(">>>>>>>>>>>address:{}", address);
        logger.info(">>>>>>>>>>>ip:{}", ipAddress);
        logger.info(">>>>>>>>>>>port:{}", port);
        logger.info(">>>>>>>>>>>logRetentionDays:{}", logRetentionDays);
        logger.info(">>>>>>>>>>>logPath:{}", logPath);
        logger.info(">>>>>>>>>>>accessToken:{}", accessToken);
        inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ipAddress);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}
  • 4.写定时任务业务代码
@Component
public class MobileJobhandler {

	//统计任务服务
    @Autowired
    private StatisticTask statisticTask;

    /**
     * 统计定时任务 在xxl-job中设置该任务凌晨5:30点执行
     * 使用XxlJob注解,里面的value=mobileTasks
     * 在xxl-job web后台的任务管理的 JobHandler中对应填写 mobileTasks ,通过xxl-job执行时,就会调用该业务服务
     * @return
     */
    @XxlJob("mobileTasks")
    public ReturnT<String> scheduledTasks(String param) {
        //业务统计服务代码,就不列出来了
        statisticTask.scheduledTasks();
        return ReturnT.SUCCESS;
    }
}
  • 5.分布式任务调度平台调度业务服务中的任务,在xxl-job后台新增任务,里面定义好cron执行时间,该任务执行那个 JobHandler ,JobHandler="mobileTasks"与代码中@XxlJob(“mobileTasks”)对应
    分布式任务调度平台xxl-job初使用_第3张图片
  • 6.启动定时任务,状态就位RUNNING了,还可以查询任务日志
    分布式任务调度平台xxl-job初使用_第4张图片
    xxl-job的初步使用就分享这些了,具体的请看官方说明,很详情

你可能感兴趣的:(SpringBoot,项目开发,xxl-job,分布式任务)