初次使用xxl-job

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

1.部署调度中心

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

1.1jar 部署

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

1.2docker 容器部署

使用docker hub中的image
  1. 拉取镜像
//命令
docker pull xuxueli/xxl-job-admin:2.4.0
  1. 运行
// 替换项目中所用的数据库 用户名 密码 
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文件

docker build -t xxl/xxl-job-admin-copy:v1 .

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

2.1引入依赖

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

2.2添加配置文件

创建application.properties

# 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

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

}
@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. 新增任务参数。
执行器:选择添加的执行器
任务描述:自定义
负责人:自定义
报警邮件:任务执行错误发邮件给谁
调度类型:cron 按照表达式执行。固定速度 多长间隔执行一次
运行模式:bean 
JobHandler:填写 @XxlJob中的value
路由策略: 
调度过期策略:
阻塞处理策略:
失败重试次数:调度失败进行重试的次数
任务超时时间:在客户端执行的会记录时间,超过改时间判定任务失败
子任务ID:在父任务回调成功后会执行子任务。id用逗号分割

在这里插入图片描述

测试调度结果

在这里插入图片描述

3.部分参数解释

3.1路由策略

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

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

最后一个

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

轮询

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

随机

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

 一致性HASH

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

 最不经常使用

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

 最近最久未使用

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

 故障转移

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

 忙碌转移

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

 分片广播

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

3.2调度过期策略

1. 忽略
2. 立即执行一次

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

3.3 阻塞处理策略

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


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

单机串行:新的调度任务进入执行器后,该调度任务进入FIFO队列,以串行方式执行。
丢弃后续调度:新的调度任务进入执行器后,若存在相同的正在运行的调度任务,本次调度请求将会被丢弃并被标记为失败。
覆盖之前调度:新的调度任务进入执行器后,若存在相同的正在运行的调度任务,将会终止当前正在运行的调度任务,并清空队列,然后运行本次新的调度任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值