
XXL-JOB的架构图如下:
@JobHandler(value="myApiJobHandler")
@Component
public class MyApiJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
//......
return ReturnT.SUCCESS;
}
}
@XxlJob("myAnnotationJobHandler")
public ReturnT<String> myAnnotationJobHandler(String param) throws Exception {
//......
return ReturnT.SUCCESS;
}
在Spring中导入依赖即可
<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>1.8.2</version>
</dependency>
配置application.yml文件
xxl:
job:
executor:
appname: ${spring.application.name}
logpath: ${spring.application.name}/xxl-job
logretentiondays: 30
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin
accessToken: default_token
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30
添加执行器到IOC容器中
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${server.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setPort(port + 10000);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
添加执行任务
@XxlJob("testJob")
public void testJob(){
System.out.println("执行 xxl job");
}
在web端手动添加任务执行
路由策略如下:
-
第一个:选取执行器管理的注册地址列表中的第一个执行器来执行任务;
-
最后一个:选取执行器管理的注册地址列表中的最后一个执行器来执行任务;
-
轮询:依次选取执行器管理的注册地址列表中的执行器,周而复始。为了应对多个定时任务同时触发带来的数据一致性问题,XXL-JOB 使用一个静态的同步 Map 来存储每个任务的 jobId 和其对应的计数。每次计数增加后,对执行器地址列表的数量取余,将结果作为索引来获取对应的执行器地址。如果超过 24 小时没有触发调用该任务,会清空 Map 以释放一定空间;
-
随机:从执行器管理的注册地址列表中随机选取一个执行器来执行任务;
-
一致性 HASH:实现一致性 HASH 负载均衡算法;
-
最不经常使用:选择最近最少被调度的执行器执行任务(通过次数维度选取任务);
-
最近最久未使用:选择距离上次被调度时间最长的执行器执行任务(通过时间维度选取任务),有助于平衡各执行器的工作负载;
-
故障转移:在任务路由策略选择“故障转移”的情况下,如果执行器集群中的某一台机器出现故障,将会自动 Failover 切换到一台正常的执行器发送调度请求;
-
忙碌转移:当任务分配到某个执行器时,如果该执行器正处于忙碌状态(可能正在执行其他任务或资源紧张),则会尝试将任务转移到其他相对空闲的执行器上执行;
-
分片广播:选取执行器管理的注册地址列表中的所有地址,每个地址都执行一次任务。这种方式类似于 MQ 的广播模式,可以将任务广播到集群中的所有执行器上执行。此策略适用于需要在多个执行器上同时执行相同任务的场景,例如数据同步或分布式计算等。
之后控制台开启任务即可。