初识 xxl-job

1,413 阅读3分钟

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

基本可以满足所有定时任务调度需求:灵活配置调度时间、分配策略、大任务拆分、容错、调度日志、仪表盘、报警

官方地址:github.com/xuxueli/xxl…

分为两部分:可视化得任务调度中心和任务执行器

整体搭建测试步骤

启动任务调度中心服务并新增执行器(appname)->创建执行器工程并编写任务逻辑(jobHandler)->启动任务执行器注册到调度中心(对应于第一步创建的appname)->调度中心页面创建任务执行

demo代码: github.com/lidefu1993/… (easy-java-job-admin、easy-java-job )

任务调度中心服务

1、创建mysql数据库,xxl-job,执行对应版本的mysql脚本创建基础表

2、下载 xxl-job-2.2.0 源码,提取xxl-job-admin部分代码,修改pom.xml(源admin依赖xxx-job父级工程),修改application.properties(mysql配置, email配置)

3、启动springboot工程,访问 http://ip:port/xxl-job-admin

任务调度中心启动完成

4、创建执行器,方便后续执行器注册过来

创建任务执行器时的appname对应于此处创建的appname

创建执行器工程

1、创建springboot工程,引入xxl-job-core依赖

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.2.0</version>
</dependency>

2、修改application.properties

server.port=8086

##必须要有该项 否则注册不到指定的appname下
server.servlet.context-path=/my-job

### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://localhost:8085/xxl-job-admin

### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=

### 执行器AppName [选填]:执行器心跳注册分组依据(要对应已经存在的appName);为空则关闭自动注册 
xxl.job.executor.appname=xxl-job-executor-sample

### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=

### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=10004

##执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=-1

### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=logs/xxl-job

3、创建启动类,配置调度中心,任务逻辑

package com.ldf.easy;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

/**
 * @author lidefu
 * @date 2020年07月10日14:26
 **/
@SpringBootApplication
public class JobApp {

    public static void main(String[] args) {
        SpringApplication.run(JobApp.class, args);
    }

    @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 Integer port;

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

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

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

    /**
     * 调度中心配置
     */
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        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;
    }

    /**
     * 任务逻辑
     * @param param 传入参数
     * @return -
     * @throws InterruptedException-
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> execute(String param) throws InterruptedException {
        System.out.println("-----------------job1 begin----------------");
        System.out.println("param:" + param);
        for(int i = 0; i<3; i++){
            System.out.println("hello world. com.ldf.easy.Job2App : " + i);
            Thread.sleep(1000);
        }
        System.out.println("-----------------job1 end----------------");
        return ReturnT.SUCCESS;
    }


}

4、启动执行器,查看调度中心对应的执行器下的OnLine机器地址

已成功注册

5、创建任务

在任务调度中心-任务管理新增任务,选择对应的执行器,JobHandler为 @XxlJob("demoJobHandler")的值:demoJobHandler

6、启动任务