docker+spring boot集成xxl-job

下载xxl-job源码:点此下载

初始化xxl数据库
sql脚本位置:/xxl-job/doc/db/tables_xxl_job.sql

xxl注册中心(xxl-job-admin)
修改xxl-job-admin的配置文件application.properties的数据库信息:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

注意:如果mysql做主从配置,调度中心集群节点务必强制走主库

打包构建xxl-job-admin镜像:

  1. 在服务器上新建一个文件夹,文件夹内放置xxl-job-admin的jar包和Dockerfile文件

  2. Dockerfile文件内容

    # jdk镜像根据自身情况配置
    FROM openjdk:8-jre-alpine 
    MAINTAINER admin@test.com
    
    ENV PARAMS=""
    
    ENV TZ=PRC
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    # xxl-job-admin-*.jar为jar名称,根据自身情况配置
    ADD xxl-job-admin-*.jar /app.jar
    
    ENTRYPOINT ["sh","-c","java -jar /app.jar $PARAMS"]
    
  3. 切换到该文件夹下,打包镜像:docker build -t 镜像名:版本 .

执行器(微服务模块)

  1. 引用依赖

    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>版本号</version>
    </dependency>
    
  2. 新建XxlJobConfig类

    @Configuration
    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", destroyMethod = "destroy")
        public XxlJobSpringExecutor xxlJobExecutor() {
            log.info(">>>>>>>>>>> xxl-job config init.");
            XxlJobSpringExecutor xxlJobExecutor = new XxlJobSpringExecutor();
            xxlJobExecutor.setAdminAddresses(adminAddresses);
            xxlJobExecutor.setAppName(appName);
            xxlJobExecutor.setIp(ip);
            xxlJobExecutor.setPort(port);
            xxlJobExecutor.setAccessToken(accessToken);
            xxlJobExecutor.setLogPath(logPath);
            xxlJobExecutor.setLogRetentionDays(-1);
            return xxlJobExecutor;
        }
    }
    
  3. 修改yml配置文件

    xxl:
      job:
        admin:
          addresses: http://127.0.0.1:8090/xxl-job-admin
        executor:
       	  ### 当前微服务的spring.cloud.config.name
          appname: test
          ip: 127.0.0.1
          ### 从docker-compose配置的环境变量中获取端口号(如果没有获取到就使用默认的)
          port: ${XXL_JOB_EXECUTOR_PORT:0}
          logpath: /data/applogs/xxl-job/jobhandler
          logretentiondays: -1
        accessToken:
    
  4. 新建JobHandler

@JobHandler(value = "demoJobHandler") //value只需要和下面新增任务中的JobHandler值一致
@Component
@Slf4j
public class HomePageJob extends IJobHandler {
    @Override
    public ReturnT<String> execute(String param) throws IOException, ParseException {
        //定时器业务逻辑
        return ReturnT.SUCCESS;
    }
}

注意
微服务集群部署或者有多个微服务时,建议执行器的ip和端口手动指定,以下方式为docker-compose通过添加系统变量的方式传入端口号

services:
  test-1:
    image: "test:V1"
    ports:
      - 9999:9999
    mem_limit: 2500m
    volumes:
      - /logs:/logs
    environment:
      - XXL_JOB_EXECUTOR_PORT=9999
  test-2:
    image: "test:V1"
    ports:
      - 10000:10000
    mem_limit: 2500m
    volumes:
      - /logs:/logs
    environment:
      - XXL_JOB_EXECUTOR_PORT=10000

使用xxl-job
地址:http://127.0.0.1:8090/xxl-job-admin/

  1. 添加执行器
    docker+spring boot集成xxl-job_第1张图片
    注意:AppName需要和上面配置的appname一致

  2. 新增任务
    docker+spring boot集成xxl-job_第2张图片

路由策略

  1. 第一个:当选择该策略时,会选择执行器注册地址的第一台机器执行,如果第一台机器出现故障,则调度任务失败。

  2. 第二个:当选择该策略时,会选择执行器注册地址的第二台机器执行,如果第二台机器出现故障,则调度任务失败。

  3. 轮询:当选择该策略时,会按照执行器注册地址轮询分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移。

  4. 随机:当选择该策略时,会按照执行器注册地址随机分配任务,如果其中一台机器出现故障,调度任务失败,任务不会转移。

  5. 一致性HASH:当选择该策略时,每个任务按照Hash算法固定选择某一台机器。如果那台机器出现故障,调度任务失败,任务不会转移。

  6. 最不经常使用:当选择该策略时,会优先选择使用频率最低的那台机器,如果其中一台机器出现故障,调度任务失败,任务不会转移。(实践表明效果和轮询策略一致)

  7. 最近最久未使用:当选择该策略时,会优先选择最久未使用的机器,如果其中一台机器出现故障,调度任务失败,任务不会转移。(实践表明效果和轮询策略一致)

  8. 故障转移:当选择该策略时,按照顺序依次进行心跳检测,如果其中一台机器出现故障,则会转移到下一个执行器,若心跳检测成功,会选定为目标执行器并发起调度(执行器集群时设置)。

  9. 忙碌转移:当选择该策略时,按照顺序依次进行空闲检测,如果其中一台机器出现故障,则会转移到下一个执行器,若空闲检测成功,会选定为目标执行器并发起调度。

  10. 分片广播:当选择该策略时,广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务。如果其中一台机器出现故障,则该执行器执行失败,不会影响其他执行器。

阻塞策略
调度过于密集执行器来不及处理时的处理策略;

  1. 单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
  2. 丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
  3. 覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;

你可能感兴趣的:(spring,boot,分布式,java,docker-compose,xxl-job)