背景
为了能够更加灵活的控制定时任务,最近在项目中开始推行定时任务调度系统,跟不少大厂朋友交流之后,发现XXL-Job市场还是挺广的,功能强大,定为首选。
再加上XXL-Job是基于Spring Boot的开源项目,二次开发非常容易,所以就选定了XXL-Job。这篇文章就带大家领略一下XXL-Job的魅力,可以不用,但不可不知道。
XXL-Job简介
访问官方网站会看到XXL-Job各类特性介绍,这里总结一下就是:学习简单、轻量级、易扩展、动态生效、调度中心HA、执行器HA、弹性扩容缩容、路由策略、故障转移、阻塞处理策略、任务超时控制、任务失败重试、任务失败告警、分片广播任务、动态分片、事件触发等很多特性。
上面介绍了优点,而个人在实践和使用的过程中发现代码的规范性、代码质量等都有待提高和规范。具有二次开发能力的我们,可以对配置文件环境隔离、日志配置等进行定制化处理。提升空间还是有的。
下面就来具体实践、体验一下。
源码下载
可通过GitHub或Gitee上下载源码:
GitHub地址:http://github.com/xuxueli/xxl-job
Gitee地址:https://gitee.com/xuxueli0323/xxl-job
这里通过Gitee下载:
git clone git@gitee.com:xuxueli0323/xxl-job.git
下载完成,用IDE打开项目结构:
xxl-job
直接拉取代码是主干代码,可看到版本是2.3.1-SNAPSHOT,原则上还是建议使用稳定版本。此时可以通过git命令从主干切换到稳定版本2.3.0或通过IDE提供的版本工具进行切换。
这里通过git命令切换到远程分支:
git checkout -b 2.3.0 origin/2.3.0
项目结构项目源码结构如下:
- xxl-job-admin:调度中心
- xxl-job-core:公共依赖
- xxl-job-executor-samples:执行器Sample示例;
- xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
- xxl-job-executor-sample-frameless:无框架版本;
部署时,调度中心单独部署,samples中代码可集成到项目中进行使用。
初始化表结构
找到项目源码中doc/db目录下的tables_xxl_job.sql,用来初始化数据库表结构。
会创建一个名为xxl_job的数据库,并且包含了8张以xxl_job开头的表
xxl_job表
修改项目配置
打开xxl-job-admin项目中的application.properties文件进行后台的配置,比如配置数据库连接、配置发送邮件地址等信息。
此时你应该也想到,需要把整个项目纳入到自己的代码仓库,进行配置修改、环境隔离以及进行部分二开工作。
笔者进行了简单的改造,将原本的application.properties配置文件进行了拆分:
- application.properties
- application-dev.properties
- application-prod.properties
- application-test.properties
在application.properties中指定不同环境采用不同的配置文件信息,方便自动化发布。
spring.profiles.active=dev
打包发布
此时可以直接在IDE中执行Spring Boot的main方法来启动项目,看看效果,也可以打成jar包进行发布。使用过Spring Boot的朋友们应该都知道如何去操作。
这里直接启动,会发现日志文件找不到,无法启动程序。原因在logback.xml中的配置:
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
最简单的操作是将该路径改为本地存在的目录。但笔者认为将日志路径写死在xml文件中并不优化,进一步二开将其提取到配置文件中。
<!-- <property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>-->
<springProperty scope="context" name="log.path" source="log.path"/>
不同环境的配置文件添加路径配置:
log.path=/Users/zzs/temp/xxl-job-admin.log
修改之后,启动完毕。
访问:http://localhost:8888/xxl-job-admin
这里笔者将端口进行了修改。默认的用户名为:admin,密码为:123456。
登录成功,主界面显示如下:
xxl-job-admin
关于admin的部署已经完成,接下来需要先编写执行器的代码,然后再通过admin进行调用。
执行器编写及部署
执行器代码可直接参考xxl-job-executor-sample-springboot中的实例进行编写。
本质上就是Spring Boot项目中引入了xxl-job的依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
然后通过配置类对XxlJobSpringExecutor进行初始化,剩下的就是基于@XxlJob来定义定时任务的JobHandler。
如下便新定义了一个JobHandler:
@Component
public class MyXxlJob {
@XxlJob("helloXxlJobHandler")
public void helloXxlJobHandler() {
String jobParam = XxlJobHelper.getJobParam();
System.out.println("jobParam=" + jobParam);
System.out.println("Hello XXL-Job");
}
}
在启动之前,先对xxl-job-executor-sample-springboot的配置文件进行修改,除了前面提到的日志文件,还涉及到xxl.job.admin.addresses,修改为admin的地址:
xxl.job.admin.addresses=http://localhost:8888/xxl-job-admin
执行main方法,启动程序。此时,再回到admin管理页面的任务管理菜单:
任务管理
点击右上角新增任务:
新增任务
按照参数说明配置完成,结果如下:
执行
执行完成 ,可在调度日志中查看到执行的历史。
调度日志
看看控制台:
jobParam=hello,xxl-job
Hello XXL-Job
程序被成功调用,同时也获取到了admin传递的参数。
此后,该定时任务的执行频次、执行规则,甚至执行时传递的参数都可以通过admin管理平台进行操作。
小结
经过本文体验了一把XXL-Job,感觉怎么样?比在项目中写死定时任务或在数据库中配置灵活多了,有管理页面,有执行历史,可以灵活配置,甚至可以传递调用参数等等功能都是非常实用的。建议你也尝试一把。