XXL-JOB 是一个分布式任务调度平台,支持分片任务执行。
在项目中引入 XXL-JOB 的相关依赖。通常,你需要在项目的 pom.xml 文件中添加如下依赖:
- <dependency>
- <groupId>com.xuxueligroupId>
- <artifactId>xxl-job-coreartifactId>
- <version>2.3.0version>
- dependency>
编写需要调度的任务类,并使用 @XxlJob 注解标记需要执行的方法。
在需要分片的方法上使用 @XxlJob 注解,并添加 @XxlJob(value = "yourJobHandler", distributedJob = true) 注解配置分片任务。
- import com.xxl.job.core.context.XxlJobHelper;
- import com.xxl.job.core.handler.annotation.XxlJob;
-
- public class MyJobHandler {
-
- @XxlJob(value = "yourJobHandler", distributedJob = true)
- public void execute() {
- // 获取分片参数
- int shardIndex = XxlJobHelper.getShardIndex();
- int shardTotal = XxlJobHelper.getShardTotal();
-
- // 根据分片参数执行相应的逻辑
- for (int i = 0; i < 1000; i++) {
- if (i % shardCount == shardIndex) {
- // 当前分片项需要执行的任务逻辑
- System.out.println("Shard " + shardIndex + " is running: " + i);
- }
- }
-
- // 任务执行完成后,如果有分片任务,需调用该方法告知调度中心当前分片任务已完成
- XxlJobHelper.handleShardResult("分片任务执行完成");
- }
- }
在Spring Boot 项目中,需要注册 JobHandler 到 Spring 容器。可以使用 @Component 或者配置文件来完成注册。
- import com.xxl.job.core.executor.XxlJobExecutor;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class XxlJobConfig {
-
- @Bean
- public XxlJobExecutor xxlJobExecutor() {
- XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();
- xxlJobExecutor.setAdminAddresses("http://your-admin-address");
- xxlJobExecutor.setAppName("your-app-name");
- xxlJobExecutor.setIp("your-ip");
- xxlJobExecutor.setPort(9999);
- xxlJobExecutor.setAccessToken("your-access-token");
- xxlJobExecutor.setLogPath("your-log-path");
- xxlJobExecutor.setLogRetentionDays(7);
-
- return xxlJobExecutor;
- }
- }
在 XXL-JOB 的管理中心(Admin)中配置任务,确保分片任务的设置正确(具体配置可以参考 XXL-JOB 官方文档)。
当任务触发时,调度中心将任务发送给执行器。
执行器根据配置的任务处理器(JobHandler)找到对应的任务方法。
如果该任务方法使用了 @XxlJob 注解,并配置了 distributedJob = true,则启用分片任务。
分片任务在执行前,执行器会根据配置的 shardTotal 数量创建对应的子任务。
每个子任务执行时,可以通过 XxlJobHelper.getShardIndex() 和 XxlJobHelper.getShardTotal() 获取当前分片任务的索引和总数。
子任务执行完成后,需要调用 XxlJobHelper.handleShardResult("分片任务执行完成") 来告知调度中心当前分片任务已完成。