什么是XXL-JOB?

776 阅读5分钟

1. 介绍

XXL-JOB是一个轻量级、分布式的Java任务调度平台。以下是它的一些基本原理:

  1. 任务注册与发现:XXL-JOB的任务调度中心和执行器均是独立的Spring Boot应用。执行器在启动时会向调度中心注册,包括执行器的地址等信息。这使得调度中心可以在需要时找到所有可用的执行器。
  2. 任务调度:当你在调度中心设置一个任务并指定其执行周期(例如,每天凌晨2点)后,调度中心会按照设定的周期对注册的执行器发起RPC调用,触发任务执行。
  3. 任务执行:执行器接收到调度中心的RPC调用后,会启动一个新的线程去执行任务。任务执行的结果会通过RPC返回给调度中心。
  4. 任务路由策略:XXL-JOB支持多种任务路由策略,例如随机、轮询、一致性哈希等。这些策略决定了在多个执行器可用时,调度中心应如何选择一个执行器去执行任务。
  5. 任务失败重试:如果任务执行失败,XXL-JOB提供了失败重试机制。重试次数和重试间隔都是可配置的。
  6. 任务日志:每次任务执行的日志都会被持久化在调度中心,可以通过调度中心的Web界面查看。
  7. 任务依赖: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.ipxxl.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)。下面是对每个部分的详细分析:

  1. 调度中心(Admin) :这是 XXL-JOB 的核心部分,提供了 Web 界面供用户创建、更新、删除和监控任务。它还负责维护任务的调度,将任务分派给执行器。当执行器完成任务执行后,调度中心也会接收并记录任务的执行结果。

    调度中心内部使用了 Quartz 作为任务调度框架,用于定时触发任务。当一个任务被触发时,调度中心会通过 RPC 方式调用执行器的对应接口,触发任务的执行。

    任务的信息和执行结果都存储在数据库中,包括任务的定义、调度日志、执行器的信息等。这使得用户可以通过 Web 界面查看任务的执行状态和结果。

  2. 执行器(Executor) :执行器是执行任务的组件,它是一个独立的 Spring Boot 应用。每个执行器在启动时会向调度中心注册自己,包括自己的地址、应用名等信息。

    当执行器接收到调度中心的调用后,会启动一个新的线程来执行任务。任务的执行结果会通过 RPC 方式返回给调度中心。

    执行器支持任务的并发执行,也就是说,如果一个任务被调度多次,那么每次调度都会启动一个新的线程来执行任务,这些线程会并行执行。

以上就是 XXL-JOB 的主要组成部分和它们的原理。总的来说,XXL-JOB 通过调度中心和执行器的配合,实现了分布式的任务调度和执行。它提供了一种简单、易用的方式来处理分布式环境下的定时任务。