在开发项目的过程中涉及到了定时任务的功能 , 这里学习并使用XXL-JOB来设置定时任务
官方文档地址 : 分布式任务调度平台XXL-JOB (xuxueli.com)
简介
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
环境要求
- Maven3+
- Jdk1.8+
- Mysql5.7+
快速使用
依赖引入
1 2 3 4 5 6
| <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>${最新稳定版本}</version> </dependency>
|
根据当前的实际需求, 在这里选择Bean模式
配置调度中心
引入项目源码
在github或者Gitee上面download源码之后, 导入我们自己的项目
1 2 3 4 5
| xxl-job-admin:调度中心 xxl-job-core:公共依赖 xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器) :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式; :xxl-job-executor-sample-frameless:无框架版本;
|
配置数据库
执行doc/db//tables_xxl_job.sql
, 然后获得下面的数据库
完成调度中心配置
调度中心项目:xxl-job-admin
作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。
这里主要就是更改数据库的相关配置
配置信息说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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=root_pwd spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.mail.host=smtp.qq.com spring.mail.port=25 spring.mail.username=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
xxl.job.accessToken=
xxl.job.i18n=zh_CN
xxl.job.triggerpool.fast.max=200 xxl.job.triggerpool.slow.max=100
xxl.job.logretentiondays=30
|
运行调度中心
我们运行xxl-jon-admin
项目
然后在浏览器中打开跳转到 http://localhost:8080/xxl-job-admin
如果端口改变记得改变相应的端口
默认登录账号 “admin/123456”, 登录后运行界面如下图所示。
执行器
找到模块
我们可以看到xxl-job
里面有一个xxl-job-executor-sample-springboot
我们可以参考这个模块来写我们自己的代码
设置配置信息
执行器的配置信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.accessToken=
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.address=
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30
|
这里给出配置样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| server.port=8081
logging.config=classpath:logback.xml
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.accessToken=default_token
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.address=
xxl.job.executor.ip=127.0.0.1
xxl.job.executor.port=8889
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30
|
完成配置
在我们配置好相关的信息之后, 还需要一个配置类来读取这些信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| @Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}") private String adminAddresses;
@Value("${xxl.job.accessToken}") private String accessToken;
@Value("${xxl.job.executor.appname}") private String appname;
@Value("${xxl.job.executor.address}") private String address;
@Value("${xxl.job.executor.ip}") private String ip;
@Value("${xxl.job.executor.port}") private int port;
@Value("${xxl.job.executor.logpath}") private String logPath;
@Value("${xxl.job.executor.logretentiondays}") private int logRetentionDays; @Bean public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
|
配置任务
在我们启动这个样例项目之后 , 我们进入调度中心
点击新增任务 , 可以添加我们需要执行的任务
对于java平台来说 , 主要的配置方法有两种
-
通过java Bean
-
GLUE(java)
该种配置方式是吧代码写在web Ide中 , 因此不需要我们手动设置jsonHandler
通过javaBean配置任务
我们首先仿照xxl-jon-executor-sample-springboot
在我们自己的项目中集成xxl-job
主要有三步
- 设置配置信息
- 设置配置类
- 配置JobHandler
前两部在前面基本已经提到了 , 直接仿照sample即可
对于第三步, 既然我们选择的是Bean模式, 顾名思义, 我们需要在类上面注册Bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Component public class TestXxlJob { private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
@XxlJob("TestJobHandler") public void demoJobHandler() throws Exception { XxlJobHelper.log("RefreshTopicScoreJob has started!"); for (int i = 0; i < 5; i++) { XxlJobHelper.log("RefreshTopicScoreJob beat at:" + i); TimeUnit.SECONDS.sleep(2); } } }
|
注意 , 如果在网上找别的教程 , 可能会发现有人使用@JobHandler
类注解 , 但是现在该注解在新版xxl-job中已经移除了
需要注意的是 @XxlJob
注解里面的value
属性需要与我们之后再调度中心配置的任务名称相同
我们在本地代码中完成相关任务配置之后 , 即可前往调度中心进行任务配置
需要注意的是之前我们进行了调度器的相关配置, 注意这个xxl.job.executor.port
指的是我们调度器执行的端口, 不能与原项目运行的端口相同
1 2
| xxl.job.executor.ip=127.0.0.1 xxl.job.executor.port=8889
|
配置任务
我们首先启动本地springboot项目, 如果配置成功 , 可以在项目的运行日志上看到
我们在 任务管理 – 右上角点击新增 , 即可添加任务
通过操作来执行任务 ,
点击执行一次, 即可执行一次任务 , 可以在调度日志中查看任务执行情况
那么基本的通过xxl-job进行任务配置的操作就差不多了, 如果有别的需求, 直接参考[官方文档 ](https://www.xuxueli.com/xxl-job/#2.1 初始化“调度数据库”), 一步一步跟着做, 基本不会有什么大问题