文章目录
- 使用xxl-job执行定时任务
- xxl-job原理
- 我们自己的项目里面需要怎么写定时任务呢?
- 如果想要使用xxl-job我们需要在服务器上部署两个项目
使用xxl-job执行定时任务
xxl-job原理
首先xxl-job的全拼是“XiaoXiaoLiang Job”或者“Xu Xue Li”作者的名字,其核心设计理念是“开发迅速、学习简单、轻量级、易扩展”。通过Web界面,用户可以方便地管理任务,包括创建、更新、删除和查看任务运行状况。
xxl-job执行定时任务的原理是什么?
xxl-job执行定时任务的原理主要基于调度中心和执行器的交互,利用数据库作为中间存储,通过时间轮算法精确触发任务,并支持分布式场景下的高可用和负载均衡。
xxl-job是一个轻量级分布式任务调度框架,旨在解决大规模任务调度问题。其核心架构分为调度中心和执行器两大部分。调度中心主要负责任务的管理和调度,而执行器则负责具体任务的执行。下面,从几个关键点来具体分析xxl-job的工作原理:
- 调度中心:调度中心是整个xxl-job的核心,它本身是一个Web服务,主要功能包括任务的管理、调度配置以及监控和报警。调度中心依赖于数据库来存储所有任务的信息,这样即便调度中心的服务重启或者崩溃,任务信息也不会丢失。这种设计也使得调度中心可以水平扩展,通过数据库实现数据的一致性和共享。
- 执行器:执行器实际上就是承载具体任务执行逻辑的服务。每个执行器都需要向调度中心注册,这样调度中心才能将任务分配给具体的执行器。执行器可以横向扩展,通过增加执行器的数量来提高任务处理能力。
- 时间轮算法:为了保证任务能够在预定时间精确触发,xxl-job采用了时间轮算法。时间轮可以看作是一个由多个刻度组成的数组,每一个刻度代表一个时间点。当时间轮的指针走到某个刻度时,该刻度上的所有任务都会被触发并执行。这种算法确保了任务能够在精确的时间点被触发,并且能够高效地处理大量的定时任务。
- 任务执行模型:xxl-job的任务执行模型非常灵活,支持多种触发策略,如Cron表达式、固定间隔、固定延时等。这些触发策略能够满足大多数业务场景的需求。同时,xxl-job还支持任务的动态修改和即时生效,这意味着可以在不重启服务的情况下,在线修改任务的状态和参数。
总的来说,xxl-job通过调度中心和执行器的分离,实现了任务调度与执行的解耦,提高了系统的灵活性和可扩展性。时间轮算法的应用确保了任务能够在预定时间准时触发,极大地提高了任务处理的效率。分布式和支持集群的特性使得xxl-job能够适应大规模、高并发的场景,非常适合现代企业对定时任务调度的需求。
可以把调度中心理解成xxl-job的管理中心,如下图:
对应的web页面如下图:
而执行器是什么呢?如下图:
看下执行器的配置如下图:
在我们实际的项目中(就是非xxl-job-admin任务调度中心项目,我们自己写的项目),需要写一个对应的执行器java类与其对应,如下图:
这里的执行器的配置信息必须与任务调度中心web界面中配置的保持一致,比如你可以发现appName的值都是my-first-timerTask,还有就是执行器的端口号都是8083;然后adminAddresses是我们的调度中心的地址;注意调度中心的端口号是和我们的执行器的端口号不一样的,不要重复了。
然后一个执行器可以执行多个定时任务,为了减轻执行器的负担,我们还可以横向扩展执行器,就是我们可以再加一些执行器,去执行不同的定时任务;
个人理解的xxl-job执行定时任务的原理?
xxl-job执行定时任务的原理是它会定时执行任务调度中心的任务执行器,如下图:
然后通过任务执行器关联到我们本地项目中的执行器,如下图:
这个时候我们本地项目其实已经就知道执行代码中的哪个方法了,为什么呢?因为我们的任务调度中心中已经告诉执行器它需要执行的定时任务是谁了,如下图:
比如我们上图中需要执行的任务的名字就是dataBackupJobHandler,然后就会去本地项目中找注解@XxlJob的值是这个的定时任务方法,如下图:
我们自己的项目里面需要怎么写定时任务呢?
首先引入xxl-job的依赖,如下:
<!-- XxlJobSpringExecutor任务执行器依赖 --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version></dependency>
然后写我们的任务使用的执行器,需要和xxl-job的web界面中的执行器保持一致,上面已经介绍过了;
接着在我们自己的项目中写我们想要执行的定时任务,比如我们现在是想执行一个日志定时任务,就是每隔10s输出一下日志信息,我们的定时任务要如何写呢?如下图:
/*** @author 望轩* @createDate 2024/7/23 16:35*/
@Component
public class DataBackupJobHandler {@XxlJob("dataBackupJobHandler")public ReturnT<String> execute(String param) throws Exception {// 在这里编写你的数据备份逻辑// 例如,将数据库中的数据导出到文件或云存储等System.out.println("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆我正在备份 份 份 儿啊!☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");return ReturnT.SUCCESS;}
}
至于控制定时任务每隔多少时间执行的cron表达式,我们需要在xxl-job的web界面中配置,如下图:
这里最关键的配置其实就有三个,一个是JobHandler属性,它是指定我们的定时任务的名字的,和我们java代码中的定时任务的名字一致,也就是上面java定时任务类中的@XxlJob注解的值;
第二个关键配置是Cron,这个主要是配置Cron表达式的,通过Cron表达式可以控制定时任务每隔多少时间执行一次;
最后一个关键配置是执行器,这里我们选择的是如下图:
它表示我们的定时任务将使用我们的这个定时任务执行器执行。一个执行器可以执行很多不同的定时任务,只要你的定时任务是选择的当前任务执行器,那么它就会被这个执行器执行;当我们一个任务执行器的负担太重,也就是执行的定时任务太多的时候,我们为了减轻负担,可以重新创建一个任务执行器。
如果想要使用xxl-job我们需要在服务器上部署两个项目
第一个项目肯定是我们自己的项目,这个项目里面有我们真正想要执行的定时任务方法;
第二个项目是xxl-job任务调度中心项目,这个项目是大众点评的许雪里开发的,是一个开源项目,可以去gitee上下载下来,地址连接:https://gitee.com/xuxueli0323/xxl-job?_from=gitee_search
下载完之后,它其实就是一个web项目,因此里面也有一些相关的数据库表,也需要我们在本地数据库里面创建下,如下图:
端口号设置:可以把xxl-job任务调度中心web项目的端口号设置为8080,任务执行器的设置为8083,你自己的项目也就是定时任务方法所在的那个项目端口号设置为8081;
最后看下定时任务执行结果,如下图: