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-joblogretentiondays: 30admin:addresses: http://127.0.0.1:8080/xxl-job-adminaccessToken: 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;@Beanpublic 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 的广播模式,可以将任务广播到集群中的所有执行器上执行。此策略适用于需要在多个执行器上同时执行相同任务的场景,例如数据同步或分布式计算等。
之后控制台开启任务即可。