初次使用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队列,以串行方式执行。
丢弃后续调度:新的调度任务进入执行器后,若存在相同的正在运行的调度任务,本次调度请求将会被丢弃并被标记为失败。
覆盖之前调度:新的调度任务进入执行器后,若存在相同的正在运行的调度任务,将会终止当前正在运行的调度任务,并清空队列,然后运行本次新的调度任务。
相关推荐
Asthenia04123 小时前
浏览器缓存机制深度解析:电商场景下的性能优化实践
后端
databook4 小时前
『Python底层原理』--Python对象系统探秘
后端·python
超爱吃士力架6 小时前
MySQL 中的回表是什么?
java·后端·面试
追逐时光者6 小时前
Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
后端·.net
苏三说技术7 小时前
10亿数据,如何迁移?
后端
bobz9657 小时前
openvpn 显示已经建立,但是 ping 不通
后端
customer088 小时前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
qq_459238498 小时前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
灰色人生qwer8 小时前
SpringBoot 项目配置日志输出
java·spring boot·后端
阿华的代码王国8 小时前
【从0做项目】Java搜索引擎(6)& 正则表达式鲨疯了&优化正文解析
java·后端·搜索引擎·正则表达式·java项目·从0到1做项目