背景

为了能够更加灵活的控制定时任务,最近在项目中开始推行定时任务调度系统,跟不少大厂朋友交流之后,发现XXL-Job市场还是挺广的,功能强大,定为首选。

再加上XXL-Job是基于Spring Boot的开源项目,二次开发非常容易,所以就选定了XXL-Job。这篇文章就带大家领略一下XXL-Job的魅力,可以不用,但不可不知道。

XXL-Job简介

访问官方网站会看到XXL-Job各类特性介绍,这里总结一下就是:学习简单、轻量级、易扩展、动态生效、调度中心HA、执行器HA、弹性扩容缩容、路由策略、故障转移、阻塞处理策略、任务超时控制、任务失败重试、任务失败告警、分片广播任务、动态分片、事件触发等很多特性。

上面介绍了优点,而个人在实践和使用的过程中发现代码的规范性、代码质量等都有待提高和规范。具有二次开发能力的我们,可以对配置文件环境隔离、日志配置等进行定制化处理。提升空间还是有的。

下面就来具体实践、体验一下。

源码下载

可通过GitHub或Gitee上下载源码:

GitHub地址:http://github.com/xuxueli/xxl...

Gitee地址:https://gitee.com/xuxueli0323...

这里通过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,密码为: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,感觉怎么样?比在项目中写死定时任务或在数据库中配置灵活多了,有管理页面,有执行历史,可以灵活配置,甚至可以传递调用参数等等功能都是非常实用的。建议你也尝试一把。

博主简介:《SpringBoot技术内幕》技术图书作者,酷爱钻研技术,写技术干货文章。

公众号:「程序新视界」,博主的公众号,欢迎关注~

技术交流:请联系博主微信号:zhuan2quan


程序新视界
233 声望50 粉丝

长期从事第三方支付行业,拥有支付账户、支付网关、账 务系统、清结算系统、风控反洗钱系统等经验,后期从事区块链技术相关技术研究,拥有开发完整电子货币钱包经验。并录制《Drools7规则引擎入门教程》