xxl-job从入门到入土
xxl-job介绍
xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。
xxl-job开源项目
xxl-job使用
xxl-job整合SpringBoot
- 引入xxl-job的依赖
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.0</version>
        </dependency>
- xxl-job执行器配置
@Configuration
@Slf4j
public class XxlJobConfig {
    @Value("${xxl.job.admin.address}")
    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;
    /**
     * 执行器
     */
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor executor = new XxlJobSpringExecutor();
        //调度中心地址
        executor.setAdminAddresses(adminAddresses);
        //执行器名称
        executor.setAppname(appname);
        //执行器地址
        executor.setAddress(address);
        //执行器ip
        executor.setIp(ip);
        //执行器端口,如果集单机群部署,则执行器的端口需要不一样
        executor.setPort(port);
        //需要和调度中心配置文件中的配置一致
        executor.setAccessToken(accessToken);
        //执行器日志存储路径
        executor.setLogPath(logPath);
        //执行器日志文件保存天数,过期日志自动清理, 大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
        executor.setLogRetentionDays(logRetentionDays);
        return executor;
    }
}
- application.yml文件
xxl:
  job:
    accessToken: default_token  #与xxl-job-admin配置一致
    admin:
      address: http://localhost:8080/xxl-job-admin  #xxl-job-admin地址
    executor:  #执行器配置,执行器就是被调度中心调度的任务
      appname: xxl-job-executor-test
      address: http://127.0.0.1:9986
      ip: 127.0.0.1
      port: 9986
      logpath: /data/applogs/xxl-job/jobhandler  #日志路径
      logretentiondays: -1  #执行器日志文件保存天数 [选填] : 过期日志自动清理, 大于等于3时生效; 否则, 如-1, 关闭自动清理功能
spring:
  application:
    name: xxl-job-executor
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
server:
  port: 9987  #应用的port和执行器的port需要不一致,不然启动会报错
到这里为止,执行器的配置就完成了,但是项目不能正常启动,因为需要调度中心。
- 下载xxl-job项目,启动调度中心应用,在调度中心中创建执行器,执行器的AppName需要和执行器的配置文件中的appname保持一致,注册方式选择自动注册后,如果执行器能注册到调度中心,则会自动获取到执行器的地址,如果没有获取到地址后面执行会报错
  
- 启动执行器,看执行器的机器地址是否为空就能知道执行器有没有成功注册了
定时任务
注册定时任务有两种方式,一种是继承IJobHanlder类,还有一种是使用@xxlJob注解
继承IJobHanlder
继承IJobHanlder类后,需要使用执行器的registerHandler方法注册到执行器中,不然会执行任务会报错。
@Component("testJobHandler")
public class TestJobHandler extends IJobHandler {
    private Logger logger = LoggerFactory.getLogger(TestJobHandler.class);
    @Override
    public void execute() throws Exception {
        logger.info("TestJobHandler execute ......");
    }
}
使用执行器注册该任务
executor.registJobHandler("testJobHandler", new TestJobHandler());
不推荐使用这种方式注册任务。
@xxlJob
使用注解的缺点是需要在调度中心后台手动配置任务
    /**
     * 这里需要返回一个结果,否则任务调度中心上调度日志的执行结果显示成功,但是调度结果显示失败
     */
    @XxlJob("testJob1")
    public ReturnT<String> executeJob() {
        logger.info("testJob1 executor: " + serverPort);
        return ReturnT.SUCCESS;
    }
在调度中心配置对应任务,JobHandler需要和注解中的"testJob1"保持一致
 
对于需要手动注册定时任务的问题,网上有相应的解决方案
 魔改xxl-job,彻底告别手动配置任务!
调度中心介绍
调度中心有6个大功能,需要重点关注的是任务管理和执行器管理。
 
执行器管理
执行器管理的配置不多,比较简单,上文中已经介绍了,这里就不多说了。
 
任务管理
一个任务有下图所示的配置。
 
- 基础配置
- 报警邮件:
- 调度配置:设置任务的执行周期,执行一次还是周期性执行
任务配置
- 运行模式 
  - Bean:上文提到的两种定时任务的运行模式都是Bean
- GLUE:将定时任务的执行逻辑以代码的形式直接嵌入到执行器中。这种方式适用于需要频繁更新任务逻辑的场景
 
GLUE模式
创建一个GLUE模式的任务,可以看到此时JobHandler是只读的。
 
 在列表上选择GLUE模式的任务,操作红会有一个GLUE IDE,点击这个按钮
 
 输入需要执行的逻辑即可,建议在IDE中写好,直接复制过去。在GLUE任务的代码里面也是可以@Autowired等注解的,写好后保存即可。
 
高级配置
- 路由模式:将一个任务分发到多个执行器上执行的方式 
  - 广播模式:所有执行器都会接收到任务并执行
- 分片模式:将任务分片,每个执行器执行其中的一部分
- 固定模式:指定某个执行器执行任务
- 轮询模式:按照轮询的模式选择执行
 
- 调度过期策略:当任务执行超过预定时间后如何处理 
  - 忽略:当调度中心错过调度时间时,忽略此次调度,不再进行补偿处理
- 立即执行一次:当调度中心错过调度时间时,立即进行一次补偿触发,以确保任务能够被执行
 
- 阻塞处理策略 
  - 单机串行:默认的阻塞处理策略,当任务队列中的任务数量达到上限时,新的任务请求会在当前执行器中串行执行
- 弃后续调度:当任务队列中的任务数量达到上限时,新的任务请求会被直接丢弃
- 覆盖之前调度:当任务队列中的任务数量达到上限时,新的任务请求会覆盖之前的任务请求
 
集群
调度中心集群
XXL-JOB调度中心集群部署配置
执行器集群
xxl-job执行器集群部署及路由策略实践
微服务架构下执行器的整合
主要是两种思路:
- 将执行器整合到业务的服务实例中,比如将执行器和任务都放在库存服务中
- 单独抽出一个执行器服务,通过Feign调用其它业务服务
参考
- xxl-job执行器集群部署及路由策略实践
- XXL-JOB调度中心集群部署配置
- xxl-job





![[JavaEE] 网络初识(网络通信 及 TCP / UDP / IP 封装分用 )](https://i-blog.csdnimg.cn/direct/ae397e2303c34179beff6cbdd84e5979.png)













![[001-02-001].第2节:java开发环境搭建](https://i-blog.csdnimg.cn/blog_migrate/ed04a8ae5c3cfe161e69b986c024486e.png)