初次使用xxl-job

调度中心以下称服务端,执行器所在称客户端

1.部署调度中心

下载xxl-job源码,将目录(xxl-job→doc→db)下的sql文件在数据库(例如库名localdb)中执行

1.1jar 部署

将项目中需要修改的数据库 用户名 密码等其他内容修改后,将项目打成jar包运行即可

1.2docker 容器部署

使用docker hub中的image

  1. 拉取镜像
arduino 复制代码
//命令
docker pull xuxueli/xxl-job-admin:2.4.0
  1. 运行
ruby 复制代码
// 替换项目中所用的数据库 用户名 密码 
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://host.docker.internal:3306/localdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=false --spring.datasource.username=xxx --spring.datasource.password=xxx" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:2.4.0 --add-host="host.docker.internal:host-gateway"

自制image

将上述的jar,使用目录(xxl-job→xxl-job-admin)下的Dockerfile脚本自制运行即可。自行编写.dockerignore文件

bash 复制代码
docker build -t xxl/xxl-job-admin-copy:v1 .

2.添加job(自建的springboot项目)

2.1引入依赖

xml 复制代码
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.0</version>
</dependency>

2.2添加配置文件

创建application.properties

shell 复制代码
# log config
logging.config=classpath:logback-spring.xml

### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
### 调度中心的地址
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job, access token
### 和调度中心的token一致
xxl.job.accessToken=default_token

### xxl-job executor appname
### 执行器的名字
xxl.job.executor.appname=test
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
### 执行器的地址。 为空会默认取xxl.job.executor.ip:xxl.job.executor.port
xxl.job.executor.address=
### xxl-job executor server-info
### 执行器ip。 为空默认取本机地址
xxl.job.executor.ip=
### 执行器端口。 为空默认取9999
xxl.job.executor.port=9999
### xxl-job executor log-path
### 日志记录路径 客户端的日志会在该目录下建文件
xxl.job.executor.logpath=E:/testlog/xxl-job
### xxl-job executor log-retention-days
### 日志保留时长
xxl.job.executor.logretentiondays=30

2.3 添加job

kotlin 复制代码
@Slf4j
@Configuration
public class XxlJobConfiguration {

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

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

}
typescript 复制代码
@Component
@Slf4j
public class MyJobHandler {
    @XxlJob(value = "demoJobHandler", init="init", destroy = "destory")
    public Result<String> execute(String param) {

        log.info("exeute schedule trigger:" + LocalDateTime.now());
        return Result.success("success");
    }

    private void init() {
        log.info("init method is called successfully");
    }

    private void destory() {
        log.info("destory method is called successfully");
    }
}

调度中心配置执行器和job

浏览器输入 http://127.0.0.1:8080/xxl-job-admin/

  1. 执行器管理
  2. 新增
  3. 新增执行器 参数 appName为客户端application.properties中 xxl.job.executor.appname 值。名称为自定义的。注册方式自动注册不需要填写机器地址,手动注册需要添加机器地址
  1. 任务管理
  2. 新增
  3. 新增任务参数。
css 复制代码
执行器:选择添加的执行器
任务描述:自定义
负责人:自定义
报警邮件:任务执行错误发邮件给谁
调度类型:cron 按照表达式执行。固定速度 多长间隔执行一次
运行模式:bean 
JobHandler:填写 @XxlJob中的value
路由策略: 
调度过期策略:
阻塞处理策略:
失败重试次数:调度失败进行重试的次数
任务超时时间:在客户端执行的会记录时间,超过改时间判定任务失败
子任务ID:在父任务回调成功后会执行子任务。id用逗号分割

测试调度结果

3.部分参数解释

3.1路由策略

对于注册的执行器,选择哪个执行器去执行任务

bash 复制代码
第一个
  调度器首先会将注册先后顺序,从第一个开始 ,将会接收到任务
  调度前将不会做心跳检测
  如果调度执行失败,重试机制将仍然选择同一台机器重试

最后一个

  与第一个相反,按注册先后顺序,从最后一个倒序开始,将会接收到任务
  调度前将不会做心跳检测
  如果调度执行失败,重试机制将仍然选择同一台机器重试

轮询

  按照注册的先后顺序收到任务
  调度前将不会做心跳检测
  如果调度执行失败,重试机制将随机选择下一台机器重试

随机

  字面意思,随机选择一个执行器
  调度前将不会做心跳检测
  如果调度执行失败,重试机制将随机选择其它机器重试

 一致性HASH

  每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上
  调度前将不会做心跳检测
  如果调度执行失败,重试机制将继续选择该机器重试

 最不经常使用

  使用频率最低的机器优先被选
  选择前将不会做心跳检测
  如果被选择的机器执行失败,失败重试将触发重新选择其它机器

 最近最久未使用

  最久未使用的机器优先被选举
  选择前将不会做心跳检测
  如果被选择的机器执行失败,失败重试将触发重新选择其它机器

 故障转移

  按照顺序依次进行心跳检测,第一个心跳检测(自建执行器将请求 api/beat 接口)成功的机器选定为目标执行器并发起调度
  当没有机器可用时,将触发失败重试机制,每一次重试将会检测所有机器心跳是否正常

 忙碌转移

  按照顺序依次进行空闲检测,第一个空闲检测(自建执行器将请求 api/idleBeat 接口)成功的机器选定为目标执行器并发起调度
  当所有的机器均无空闲时,将触发失败重试机制,每一次重试将会检测所有机器是否空闲

 分片广播

  广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数
  分片调度前不会做心跳检测,但失败的分片,其重试机制将继续选择该机器重试

3.2调度过期策略

markdown 复制代码
1. 忽略
2. 立即执行一次

当任务过期时间超过5s 根据调度过期策略判断立即执行一次,还是忽略本次执行
当任务过期时间小于等于5s,立即触发一次

3.3 阻塞处理策略

调度过于密集,执行器来不及处理时的处理策略。

1.单机串行
2.丢弃后续调度
3.覆盖之前调度

单机串行:新的调度任务进入执行器后,该调度任务进入FIFO队列,以串行方式执行。
丢弃后续调度:新的调度任务进入执行器后,若存在相同的正在运行的调度任务,本次调度请求将会被丢弃并被标记为失败。
覆盖之前调度:新的调度任务进入执行器后,若存在相同的正在运行的调度任务,将会终止当前正在运行的调度任务,并清空队列,然后运行本次新的调度任务。
相关推荐
姜学迁16 分钟前
Rust-枚举
开发语言·后端·rust
【D'accumulation】1 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
2401_854391081 小时前
高效开发:SpringBoot网上租赁系统实现细节
java·spring boot·后端
Cikiss1 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
Cikiss1 小时前
微服务实战——平台属性
java·数据库·后端·微服务
OEC小胖胖1 小时前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web
2401_857617622 小时前
SpringBoot校园资料平台:开发与部署指南
java·spring boot·后端
计算机学姐2 小时前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
Yvemil73 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
2401_854391083 小时前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端