1. xxl-job
松哥也在微信群里和小伙伴们讨论过各自到底用的是 xxl-job 还是 ElasticJob,讨论的结果就是,xxl-job 使用的人更多一些。
不说功能的优劣,我们单纯从数据上其实就能看出一些端倪:
这是 xxl-job 的 GitHub:
这是 ElasticJob 的 GitHub:
从这个数据比较上大概也能看出来 xxl-job 更火一些。注意我这里说的是更火一些,不是说 xxl-job 比 ElasticJob 更强。
xxl-job 出自大众点评,这是一个分布式轻量级的任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
xxl-job 通过一个中心式的调度平台,调度多个执行器执行任务,调度中心通过 DB 锁保证集群分布式调度的一致性,这样扩展执行器会增大 DB 的压力,然而大部分公司的任务数,执行器并不多;xxl-job 提供了非常好用的监控页面甚至还有任务失败的邮件告警功能。不同于 ElasticJob,xxl-job 在使用时依赖 MySQL,而不需要 ZooKeeper。
ElasticJob 则出自当当,设计 ElasticJob 的初衷是为了面对高并发以及复杂的业务,即使是在业务量大,服务器多的时候也能做好任务调度,尽可能的利用服务器的资源。ElasticJob 是无中心化的,如果主服务器挂了,会自动通过 ZooKeeper 的选举机制选举出新的主服务器。因此 ElasticJob 具有良好的扩展性和可用性。
所以,你打算用哪个?
2. 运行 xxl-job
我们先把 xxl-job 跑起来,再写我们自己的代码。
首先我们先把 xxl-job 的代码搞下来,地址:
https://github.com/xuxueli/xxl-job
然后用 IDEA 打开项目,打开之后,有四个主要的文件夹:
doc:项目文档xxl-job-admin:任务调度平台xxl-job-core:核心代码xxl-job-executor-samples:案例
由于 xxl-job 运行需要数据库,所以接下来我们就来配置数据库,先找到数据库脚本,在 doc/db/tables_xxl_job.sql 位置。
找到数据库脚本后,导入到数据库中执行一下,执行完成后,生成如下库和表:
接下来找到 xxl-job-admin/src/main/resources/application.properties 文件,修改数据库连接信息:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
日志配置也要修改一下,在 xxl-job-admin/src/main/resources/logback.xml 文件中,有如下一行:
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
如果你是 Windows 操作系统,这里肯定要改,如果你是 Mac 的话,也有可能没有这个目录的权限,因此我建议大家改一下这里的配置,改为如下这样:
<property name="log.path" value="./applogs/xxl-job/xxl-job-admin.log"/>
改为在项目运行目录下生成这个日志文件。
修改完成后,接下来我们就可以启动 xxl-job-admin 项目了,这是一个 SpringBoot 项目,找到启动类,直接运行其 main 方法即可。
项目启动成功后,浏览器输入如下地址 http://localhost:8080/xxl-job-admin/toLogin,就可以看到登录页面了:
默认的登录账号是 admin/123456。
看到如下页面,就是登录成功了。
3. 开发定时任务
3.1 项目创建及配置
接下来我们来创建一个项目,跑一个定时任务看看。
首先创建一个 SpringBoot 项目,引入 Web 依赖,如下:
项目创建成功后,引入 xxl-job 的依赖:
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.0</version> </dependency>
然后在 resources 目录下加入 logback.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false" scan="true" scanPeriod="1 seconds"> <contextName>logback</contextName> <property name="log.path" value="./applogs/xxl-job/xxl-job-executor-sample-springboot.log"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern> </rollingPolicy> <encoder> <pattern>