SpringTask这种任务只能放在单机节点下,就是说一个程序只跑一份的情况下,用SpringTask做定时任务没有什么问题,而且很好用,但是一旦这个程序需要运行多份,定时任务用SpringTask就不行了。多份代码重复执行了。
要解决这个问题,就不能再用单节点的定时任务。
需要采用分布式定时任务,对于单节点的定时任务,一般就是采用SpringTask,还有Quarz。
如果是多节点的分布式定时任务,推荐使用的是XXL-JOB,还有一个是static-job。
目前企业中使用最多的是XXL-JOB。
XXL-JOB是当当网架构师许雪里开发的一个分布式任务调度平台,它的核心设计目标是开发迅速、学习简单、轻量级、易扩展。
当前面临的问题是,在两个Tomcat服务器中有同一段代码,这段代码是执行定时任务的,每隔一分钟执行一次。
这两段Tomcat中的代码互相隔离,没有联系。
XXL-JOB解决问题的方式是把时间节点的控制功能提出来单独做了一个终端XXL-ADMIN。
这个终端会让各个Tomcat服务器把时间节点的控制放到终端位置。
之后,每分钟执行谁,需要给任务起一个名字。
比如给两个任务都起个名字叫做a,XXL-admin终端就会控制每分钟执行一个任务a,若终端发现a任务是配置在多个节点上的,就允许在终端配置执行策略了,比如说把策略配置为轮询(也就是说轮流执行,第一分钟第一个执行,第二分钟第二个执行,…)。
也就意味着,对XXL-JOB来讲,把时间控制端和代码端分开了。
XXL-JOB的架构非常简单,由代码端和任务调度中心构成。
代码端:编写执行任务逻辑代码
任务调度中心:配置任务的执行
任务调度中心的作用就是配置一个任务的执行时间。
代码端还是原来的代码,只不过要用@XxlJob("xxxHandler")
注解声明一个任务的名字。
任务调度中心就会按照设置的时间节点执行定时任务,当调度中心发现重名任务时,允许配置一些策略。
根据上述学习,我们可以知道对于XXL-JOB来说,分为两个端,一个是调度中心,另一个是代码端。
换句话说,调度中心这个工程一般运行起来配置策略即可,代码端才是我们自己写的功能。
使用方式查看官方文档
- 源码地址:源码地址
- 文档地址:文档地址
使用步骤:
-
下载项目源码并解压,获取“调度数据库初始化SQL脚本”并执行。
-
解压源码,按照Maven格式将源码导入IDE,使用Maven进行编译,源码结构如下:
上述结构中,对我们而言,最重要的是xxl-job-admin和xxl-job-executor-sample-springboot,xxl-job-admin是任务调度中心,我们自己编写的代码端写在xxl-job-executor-samples。xxl-job-core是公共依赖,已经被调度中心和代码端依赖到了底层。
-
接下来,先把调度中心代码跑起来(SpringBoot工程,直接运行启动类),运行之前要检查数据库的账号密码是否正确。
不用管调度中心的代码,它只是一个平台。 -
接下来进行XXL-JOB配置,刚开始调度中心的配置只需要修改一下连接数据库的密码。
-
如果已经正确进行上述配置,可将项目编译打包部署。
调度中心访问地址:调度中心访问地址 (该地址执行器将会使用到,作为回调地址)
默认登录账号 “admin/123456”。
调度中心的作用是控制代码执行