文章目录
- 1.定时任务框架-xxljob
- 1.1 Xxljob介绍
- 1)xxljob概述
- 2)XXL-JOB特性
- 3) 整体架构
- 4)入门资料准备
- 1.2 xxljob快速入门
- 1)导入xxljob工程
- 2)配置数据库
- 1.初始化SQL脚本
- 2.配置数据库环境
- 3.业务处配置任务注册中心
- 3)启动任务调度中心
- 4)配置执行器工程
- 5)配置并启动任务执行器
- 2.3 cron表达式
- 1)cron表达式作用
- 2)取值范围
- 3)特殊字段含义
- 4)cron表达式阅读练习
- 3.项目集成xxljob
1.定时任务框架-xxljob
1.1 Xxljob介绍
1)xxljob概述
官方地址:http://www.xuxueli.com/xxl-job
XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
目前已有多家公司接入xxl-job,包括比较知名的大众点评,京东,优信二手车,北京尚德,360金融 (360),联想集团 (联想),易信 (网易)等;
2)XXL-JOB特性
- 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
- 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
更多详情见官网
3) 整体架构
4)入门资料准备
资料链接:https://pan.baidu.com/s/1-s-UaQNNOG56yvFg8nHEHQ?pwd=snow
1.2 xxljob快速入门
1)导入xxljob工程
2)配置数据库
1.初始化SQL脚本
将xxljob提供的初始化SQL脚本导入数据库:
整体如下:
注意:
如果表 xxl_job_registry 导入过程报 Specified key was too long; max key length is 767 bytes
错误,则尝试将联合主键关联的 varchar 改小一些即可:
CREATE TABLE `xxl_job_registry` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
> 1071 - Specified key was too long; max key length is 767 bytes
> 时间: 0s
解决:将varchar修改为100即可;
使用的字符集为(utf8mb4),这个指每个字符最大的字节数为4,所以很明显 4*255 > 767
2.配置数据库环境
3.业务处配置任务注册中心
认证注册中心端口保证与admin端口一致即可;
3)启动任务调度中心
运行xxl-job-admin工程main方法启动:
访问管理界面:http://localhost:8082/xxl-job-admin/
登录用户名:admin 密码:123456
当前我们重点关注:执行器管理和任务管理;
4)配置执行器工程
在 业务 工程修改端口号和任务注册中心端口号:
# XXJOB参数配置
xxl:
job:
accessToken:
admin:
addresses: http://127.0.0.1:8082/xxl-job-admin
executor:
appname: snow-stock-job-executor
address:
ip:
# 当前任务执行器启动时,会独立一个端口6666用于与任务管理中心交互,改端口也可改动
port: 6666
logpath: /joblog
logretentiondays: 30
该工程默认导入了xxl-core核心包:
<!--引入xxljob核心依赖-->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.0</version>
</dependency>
默认已经配置好xxl-job相关支持:
package com.xxl.job.executor.core.config;
@Configuration
@Slf4j
public class XxlJobConfig {
@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() {
log.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;
}
}
定义可执行的任务:
package com.xxl.job.executor.service.jobhandler;
@Component
@Slf4j
public class SampleXxlJob {
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob("demoJobHandler")
public void demoJobHandler() throws Exception {
//todo 打印时间
System.out.println("hello xxljob.....");
}
//.....省略......
/**
* 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;
*/
@XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")
public void demoJobHandler2() throws Exception {
XxlJobHelper.log("XXL-JOB, Hello World.");
}
public void init(){
log.info("init");
}
public void destroy(){
log.info("destory");
}
}
@XxlJob中的value值就是定时任务的一个标识,注解作用的方法,就是定时任务的逻辑,在该类下,我们可以注入自定义的job服务,然后通过注解作用的方法被调用执行;
将业务模块启动起来:
5)配置并启动任务执行器
接下来,我们将 业务 工程下的 自定义 任务,可视化配置,并启动:
输入job_test,输入的名称保证与@xxljob注解下的value值一致即可
启动任务查看执行效果:
当然,我们也可以随时停止正在被执行的任务:
2.3 cron表达式
1)cron表达式作用
xxl-job 中 的cron 表达式是用来控制触发任务使用的,表达式包含7个部分分别从秒、分、时、日、月、星期、年七个时间维度来确定任务何时每多长时间执行一次。
2)取值范围
cron表达式格式:
* * * * * * *
- - - - - - -
| | | | | | |
| | | | | | + year [optional]
| | | | | +----- day of week (0 - 7) (Sunday=0 or 7) 周1-》1
| | | | +---------- month (1 - 12)
| | | +--------------- day of month (1 - 31)
| | +-------------------- hour (0 - 23)
| +------------------------- min (0 - 59)
+------------------------------ second (0 - 59)
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
月内日期 | 1-31 | , - * ? / L W C |
月 | 1-12 或者 JAN-DEC | , - * / |
周内日期 | 1-7 或者 SUN-SAT(注意:周日是1,周一为2,周六位7) | , - * ? / L C # |
年(可选) | 留空, 1970-2099 | , - * / |
3)特殊字段含义
特殊字符 | 意义 |
---|---|
* | 匹配所有的值。如:*在分钟的字段域里表示 每分钟 |
? | 只在日期域和星期域中使用。它被用来指定“非明确的值” 不关心 |
- | 指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点” |
, | 指定几个可选值。如:“MON,WED,FRI”在星期域里表示“星期一、星期三、星期五” |
/ | 指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。“5/15”在分钟域表示每小时的5,20,35和50。符号“”在“/”前面(如:/10)等价于0在“/”前面(如:0/10) |
L | 表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五 |
W | 只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的 |
LW | L和W可以在日期域中联合使用,LW表示这个月最后一周的工作日 |
# | 只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三 |
4)cron表达式阅读练习
(1)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 15 10 * * ? 每天上午10:15触发
(8)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(9)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(10)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(11)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 ★★★
(12)0 15 10 L * ? 每月最后一日的上午10:15触发
(13)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
3.项目集成xxljob
同 1.24