前言
- 在开发过程中,会遇到需求要求定时定点的产生一些报表数据或者操作,把这一类行为统称为定时任务,实现定时任务的方式有spring注解(@Scheduled)、quartz框架以及今天要介绍的Xxl-job。
一. 什么是Xxl-job?
官网介绍:XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
现已开放源代码并接入多家公司线上产品线,开箱即用。
二.Xxl-job简单使用
- 下载源码,更改配置文件信息,仅需要修改数据库配置即可。
- 启动项目后访问:http://localhost:8080/xxl-job-admin/toLogin,用户名:admin,密码:123456。登录成功后的项目首页:
2.新建测试项目
引入Xxl-job核心依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
配置文件
server.port=8002
#日志配置文件
logging.config=classpath:logback.xml
# xxl-job任务配置中心地址,支持集群模式,多个地址用逗号隔开
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
# 调度中心通讯TOKEN,这里使用默认即可
xxl.job.accessToken=default_token
xxl.job.executor.appname=xxl-job-executor-sample
# 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
# 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=192.168.1.10
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9998
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
新建测试方法。在方法上面加入注解(@XxlJob( “fristJob”))
@XxlJob( "fristJob")
public String sendMsg(){
logger.info("我是服务:{},正在执行发送短信方法",appName);
logger.info(XxlJobHelper.getJobParam());
return "短信发送成功";
}
@XxlJob("sencodJob")
public String sendEmail() throws InterruptedException {
logger.info("我是服务:{},正在执行发送邮件方法",appName);
TimeUnit.SECONDS.sleep(5);
return "邮件发送成功";
}
配置任务
执行器:默认就行
描述:随便填
负责人:写自己
报警邮箱:需要进行邮箱配置,这里使用qq邮箱测试,当任务执行报错失败时会有邮件通知
spring.mail.host=smtp.qq.com#邮箱服务器
spring.mail.port=465#端口
spring.mail.username=邮箱
spring.mail.from=邮箱
spring.mail.password=授权密码,不是邮箱登录密码,不知道的查一下教程
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
调度类型:支持cron表达式和固定频率执行(频率默认s)
运行模式:支持java代码、cmd命令、shelle脚本等,本次使用BEAN。
JobHandler:任务执行器名称
任务参数:字符串,方法中使用XxlJobHelper.getJobParam()获取参数内容。
路由策略:支持轮训、顺序第一个或者最后一个、还支持HASH等等规则。这里测试一下轮询。修改当前项目的启动参数,模拟集群环境。
将路由策略改为轮询
子任务id:这里指的是任务列表上的id。
任务超时时间:默认单位s,当执行任务超过设定时间会失败,并且会根据重试次数进行重新调用。利用日志查看结果
重试次数改为2,点击执行一次。在方法中设定超时。发现日志有三条数据。
总结
- 与quartz相比,xxl-job支持多种开发语言,提供了可视化管理界面,由于xxl-job有服务端和客户端之分,使用起来在一定程度上使得代码的耦合性没那么高,对代码侵害低。是一个非常不错的任务调度框架,关键还是开源的。
- 本次对xxl-job进行简单的使用和了解,xxl-job还提供了docker镜像部署,感兴趣的可以了解一下。还有很多的用法没有探索和介绍,欢迎感兴趣的同学留言发表意见。