1. 介绍
XXL-JOB是一个轻量级、分布式的Java任务调度平台。以下是它的一些基本原理:
- 任务注册与发现:XXL-JOB的任务调度中心和执行器均是独立的Spring Boot应用。执行器在启动时会向调度中心注册,包括执行器的地址等信息。这使得调度中心可以在需要时找到所有可用的执行器。
- 任务调度:当你在调度中心设置一个任务并指定其执行周期(例如,每天凌晨2点)后,调度中心会按照设定的周期对注册的执行器发起RPC调用,触发任务执行。
- 任务执行:执行器接收到调度中心的RPC调用后,会启动一个新的线程去执行任务。任务执行的结果会通过RPC返回给调度中心。
- 任务路由策略:XXL-JOB支持多种任务路由策略,例如随机、轮询、一致性哈希等。这些策略决定了在多个执行器可用时,调度中心应如何选择一个执行器去执行任务。
- 任务失败重试:如果任务执行失败,XXL-JOB提供了失败重试机制。重试次数和重试间隔都是可配置的。
- 任务日志:每次任务执行的日志都会被持久化在调度中心,可以通过调度中心的Web界面查看。
- 任务依赖:XXL-JOB支持任务依赖,也就是说一个任务可以设置为在另一个任务成功执行后再执行。
上述都是XXL-JOB的一些基本原理和特性,总的来说,它通过一个中心化的调度中心和分布式的执行器,提供了一个易用、灵活、可靠的任务调度解决方案。
2. 案例
下面是一个简单的 XXL-JOB 的使用示例。在这个示例中,我们将创建一个简单的 Spring Boot 应用,并在其中定义一个 XXL-JOB 的任务。
首先,需要在你的项目的 pom.xml 文件中添加 XXL-JOB 的依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
然后,我们需要在 application.properties 文件中配置 XXL-JOB 的调度中心和执行器的信息:
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.executor.appname=springboot-demo
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.accessToken=
在这里,xxl.job.admin.addresses 是调度中心的地址,xxl.job.executor.appname 是执行器的名称,xxl.job.executor.ip 和 xxl.job.executor.port 是执行器的 IP 和端口,xxl.job.accessToken 是访问令牌,如果你没有设置访问令牌,可以保持为空。
接着,我们需要创建一个 Spring Boot 的配置类,用于配置 XXL-JOB 的执行器:
@Configuration
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppName(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
return xxlJobSpringExecutor;
}
}
最后,我们可以定义一个 XXL-JOB 的任务:
@XxlJob("demoJobHandler")
public ReturnT<String> demoJobHandler(String param) throws Exception {
XxlJobLogger.log("XXL-JOB, Hello World.");
return ReturnT.SUCCESS;
}
在这里,@XxlJob("demoJobHandler") 注解定义了一个名为 demoJobHandler 的任务,demoJobHandler 方法是任务执行的内容,param 是任务执行时的参数。
这就是一个简单的 XXL-JOB 的使用示例,你需要先启动你的 Spring Boot 应用,然后在 XXL-JOB 的调度中心创建一个任务,并指定其名称为 demoJobHandler,就可以看到任务被执行了。
需要注意的是,这个示例需要 XXL-JOB 的调度中心已经启动,并且可以通过 http://127.0.0.1:8080/xxl-job-admin 访问。你可以从 XXL-JOB 的 GitHub 仓库下载调度中
心的源代码并运行,或者使用 Docker 来运行调度中心。
3. 总结
XXL-JOB 是一个分布式任务调度平台,主要由两部分组成:调度中心(Admin)和执行器(Executor)。下面是对每个部分的详细分析:
-
调度中心(Admin) :这是 XXL-JOB 的核心部分,提供了 Web 界面供用户创建、更新、删除和监控任务。它还负责维护任务的调度,将任务分派给执行器。当执行器完成任务执行后,调度中心也会接收并记录任务的执行结果。
调度中心内部使用了 Quartz 作为任务调度框架,用于定时触发任务。当一个任务被触发时,调度中心会通过 RPC 方式调用执行器的对应接口,触发任务的执行。
任务的信息和执行结果都存储在数据库中,包括任务的定义、调度日志、执行器的信息等。这使得用户可以通过 Web 界面查看任务的执行状态和结果。
-
执行器(Executor) :执行器是执行任务的组件,它是一个独立的 Spring Boot 应用。每个执行器在启动时会向调度中心注册自己,包括自己的地址、应用名等信息。
当执行器接收到调度中心的调用后,会启动一个新的线程来执行任务。任务的执行结果会通过 RPC 方式返回给调度中心。
执行器支持任务的并发执行,也就是说,如果一个任务被调度多次,那么每次调度都会启动一个新的线程来执行任务,这些线程会并行执行。
以上就是 XXL-JOB 的主要组成部分和它们的原理。总的来说,XXL-JOB 通过调度中心和执行器的配合,实现了分布式的任务调度和执行。它提供了一种简单、易用的方式来处理分布式环境下的定时任务。