xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。(其中XXL是作者许雪里的简称)
xxl-job是对老牌调度平台Quartz进行的封装。在开始介绍xxl-job之前我来先简单的介绍下Quartz以及对其与xxl-job做个对比。
Quartz是一款老牌的任务调度平台,他也是用Java编写的,调度模型已经非常成熟了,而且很容易集成到Spring 中去,用来执行业务是一个很好的选择。但是它也面临着一些问题,比如:
1、调度逻辑(Scheduler)和任务类耦合在同一个项目中,随着调度任务数量逐渐增多,同时调度任务逻辑逐渐加重,调度系统的整体性能会受到很大的影响,
2、Quartz 集群的节点之间负载结果是随机的,谁抢到了数据库锁就由谁去执行任务,这就有可能出现早的早死,涝的涝死的情况,发挥不了机器的性能。
3、Quartz 本身没有提供动态调度和管理界面的功能,需要自己根据API进行开发。
Quartz 的日志记录、数据统计、监控不是特别完善
xxl-job对比下来有如下特性:
1、性能的提升:可以调度更多任务,
2、可靠性的提升:任务超时、失败、故障转移的处理。
3、运维更加便捷:提供操作界面、有用户权限、详细的日志、提供通知配置、自动生成报表等等。
架构设计思想:
1、将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。
2、将任务抽象成分散的JobHandler,交由“执行器”(可以理解为就是我们的服务实例)统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。)
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性,xxl-iob里面具体内容
原理
- 调度中心(Admin):作为XXL-JOB的核心组件,负责管理任务的注册、存储任务配置、调度任务执行等。调度中心提供了一个Web界面,通过这个界面,用户可以添加、修改、删除任务,以及监控任务执行的状态。
- 执行器(Executor):是任务执行的工作节点,负责实际执行被调度的任务。在使用XXL-JOB时,你需要在你的应用中集成执行器客户端,这样你的应用就能作为任务的执行者。
流程
- 集成执行器:在你的应用(比如一个Spring Boot项目)中集成XXL-JOB执行器。这通常涉及到添加Maven依赖、配置执行器的地址、端口、应用名等信息。
- 配置任务:在XXL-JOB调度中心的Web界面上配置任务。这包括指定任务的执行表达式(CRON表达式)、指定执行器、设置任务描述、配置任务参数等。
- 任务调度:基于任务配置的CRON表达式,调度中心会定时触发任务执行。调度中心通过RPC调用向指定的执行器发送执行指令。
- 任务执行:执行器接收到执行指令后,会根据指令内容执行相应的任务逻辑。这些任务逻辑是在你的应用中实现的,比如自动清理过期文章缓存、进行社区数据统计等。
- 执行反馈:任务执行完成后,执行器会将执行结果反馈给调度中心,调度中心将这些信息展示在Web界面上,包括任务的成功、失败状态,以及执行日志等。
技术社区项目应用场景
- 自动清理过期文章缓存:可以编写一个任务,该任务遍历文章缓存,检查每篇文章的过期时间,如果文章已过期,则从缓存中清除。
- 社区数据统计:可以编写一个任务,定期统计社区的用户活跃度、发帖数量等信息,为社区管理提供数据支持。
Spring Boot整合xxl-job
整合XXL-JOB到Spring Boot项目中,可以让应用支持分布式定时任务的管理和执行。这样做不仅能够提高任务执行的可靠性和灵活性,还能通过XXL-JOB提供的调度中心进行统一的任务监控和管理。下面是Spring Boot整合XXL-JOB的基本步骤:
步骤1:添加依赖
首先,在Spring Boot项目的pom.xml
文件中添加XXL-JOB执行器的依赖:
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-spring-boot-starter</artifactId><version>最新版本号</version>
</dependency>
确保使用XXL-JOB的最新版本,以获得最新功能和最好的性能。
步骤2:配置执行器
在你的Spring Boot应用的配置文件(通常是application.properties
或application.yml
)中,配置XXL-JOB执行器的相关属性。这包括执行器的名称、注册中心地址、执行器的IP和端口等:
xxl:job:admin:addresses: http://your-xxl-job-admin-address/xxl-job-adminexecutor:appname: springboot-xxl-jobip: port: 9999logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30
addresses
是XXL-JOB调度中心的地址。appname
是执行器的名称,需要在XXL-JOB调度中心注册。ip
和port
是执行器的IP地址和端口号,如果留空,则会自动获取。logpath
是任务执行日志存放的路径。logretentiondays
是日志保留天数。
步骤3:定义任务执行器
在你的应用中定义任务执行逻辑。使用@XxlJob
注解标记方法,方法名即为任务的标识。这个方法将被XXL-JOB调度中心调用来执行具体的任务逻辑:
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class SampleXxlJob {@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {// 这里写任务执行逻辑System.out.println("XXL-JOB, Hello World.");}
}
步骤4:在XXL-JOB调度中心配置任务
登录XXL-JOB调度中心的Web界面,添加一个新的任务。在任务配置中,设置任务的CRON表达式、执行器(即步骤2中配置的appname
),以及步骤3中定义的任务标识(demoJobHandler
)。
步骤5:执行和监控任务
一旦任务被配置并启动,XXL-JOB调度中心就会根据CRON表达式定时触发任务。你可以在调度中心的Web界面上监控任务的执行情况,包括成功、失败次数,以及任务执行日志等。
项目实际场景应用
技术社区项目中,在Spring Boot应用中集成XXL-JOB执行器来实现“自动清理过期文章缓存”和“社区数据统计”的场景。
1. 集成XXL-JOB执行器
首先,确保你的Spring Boot项目中包含了XXL-JOB的执行器依赖。在pom.xml
中添加:
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-executor-spring-boot-starter</artifactId><version>最新版本号</version>
</dependency>
接下来,配置执行器的基本信息。在application.properties
或application.yml
中配置:
xxl:job:executor:appname: xxl-job-demo-executoraddress:ip:port: 9999logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30admin:addresses: http://localhost:8080/xxl-job-admin
2. 实现“自动清理过期文章缓存”任务
创建一个任务处理器类,使用@XxlJob
注解定义一个任务处理器方法:
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class CacheTaskHandler {@XxlJob("cleanExpiredArticleCache")public void cleanExpiredArticleCache() {// 任务逻辑,示例代码XxlJobHelper.log("开始执行清理过期文章缓存任务");// 执行清理逻辑// 假设有一个方法cleanCache()负责实际的清理操作cleanCache();XxlJobHelper.log("过期文章缓存清理完成");}private void cleanCache() {// 实际的清理逻辑// 这里仅为示例,具体实现需要根据实际缓存机制来编写}
}
3. 实现“社区数据统计”任务
同样,创建一个任务处理器类,定义一个执行社区数据统计的任务处理器方法:
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class DataStatisticsTaskHandler {@XxlJob("communityDataStatistics")public void communityDataStatistics() {XxlJobHelper.log("开始执行社区数据统计任务");// 执行数据统计逻辑// 假设有一个方法statistics()负责实际的统计操作statistics();XxlJobHelper.log("社区数据统计完成");}private void statistics() {// 实际的统计逻辑// 这里仅为示例,具体实现需要根据你的业务需求来编写}
}
4. 在XXL-JOB调度中心配置任务
最后,你需要登录到XXL-JOB调度中心的Web界面,添加新任务,并配置任务的执行器、任务描述、CRON表达式等信息。对于上述两个任务,确保执行器
选项与你在application.yml
中配置的appname
相匹配,并在JobHandler
字段中分别填写cleanExpiredArticleCache
和communityDataStatistics
。