在开发中须要将已有的定时任务抽离出来,方便管理查看,所以选择集成分布式任务调度平台 XXL-JOB,本文就讲解下 Spring Boot 如何集成 XXL-JOB 任务调度平台。java
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。git
下面咱们在 Spring Boot 中集成 XXL-JOB 来完成定时任务的编写(本文选择的 XXL-JOB 版本为 2.2.0)。github
Spring Boot 集成 XXL-JOB 主要分为如下两步:web
配置运行调度中心(xxl-job-admin)spring
配置运行执行器项目(xxl-job-executor)sql
首先从源码仓库中下载代码,代码地址有两个:数据库
GitHub:https://github.com/xuxueli/xxl-jobapp
Gitee:http://gitee.com/xuxueli0323/xxl-job分布式
下载完以后,在 doc/db 目录下有数据库脚本 tables_xxl_job.sql,执行下脚本初始化调度数据库 xxl_job,以下图所示:ide
能够根据须要修改 xxl-job-admin 的配置文件,主要是修改数据源信息,若须要用到邮件报警功能,须要配置邮箱。
而后启动项目,正常启动后,访问地址为:http://localhost:8080/xxl-job-admin,默认的帐户为 admin,密码为 123456,访问后台管理系统后台,界面以下:
这样就表示调度中心已经搞定了,下一步就是建立执行器项目。
建立一个项目,在项目中加入 xxl-job-core 依赖,项目依赖以下所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.0</version></dependency>
在配置文件 application.properties 中配置 xxl-job 执行器的相关参数,具体内容以下:
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 执行器通信TOKEN [选填]:非空时启用;xxl.job.accessToken=### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册xxl.job.executor.appname=xxl-job-executor### 执行器注册 [选填]:优先使用该配置做为注册地址,为空时使用内嵌服务 ”IP:PORT“ 做为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。xxl.job.executor.address=### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅做为通信的时候用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";xxl.job.executor.ip=### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不一样执行器端口;xxl.job.executor.port=9999### 执行器运行日志文件存储磁盘路径 [选填] :须要对该路径拥有读写权限;为空则使用默认路径;xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 执行器日志文件保存天数 [选填] : 过时日志自动清理, 限制值大于等于3时生效; 不然, 如-1, 关闭自动清理功能;xxl.job.executor.logretentiondays=30
其中指定了上一步部署的调度中心的地址和执行器的相关参数。
而后在 config 包下建立 XxlJobConfiguration 类,会从配置文件中读取到对应的参数,接着申明一个 xxlJobExecutor 方法,返回的是一个 XxlJobSpringExecutor,这个方法主要是如何初始化并建立一个 XxlJobSpringExecutor。
@Configurationpublic class XxlJobConfiguration { private Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.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."); // registry jobhandler XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler()); // init executor 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; } }
接下来就能够建立任务了。
在这里主要演示下 Bean 模式的任务,能够基于类和方法进行开发,下面先介绍基于类的开发的任务。
首先建立一个类 BeanClassJobHandler,继承 IJobHandler 实现 execute 方法,而后经过 XxlJobLogger.log 来打印日志。
@Componentpublic class BeanClassJobHandler extends IJobHandler { @Override public ReturnT<String> execute(String param) throws Exception { XxlJobLogger.log("bean class jobhandler running..."); return ReturnT.SUCCESS; } }
基于类开发的任务须要手动注册到执行器工厂,具体代码以下所示:
XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());
到此一个任务就开发完成了,下面介绍下基于方法的开发方式:
基于方法开发的任务比较简单,编写一个方法,并添加 @XxlJob 注解,会自动扫描该任务并注入到执行器容器。
@Componentpublic class BeanMethodJobHandler { @XxlJob("beanMethodJobHandler") public ReturnT<String> beanMethodJobHandler(String param) throws Exception { XxlJobLogger.log("bean method jobhandler running..."); return ReturnT.SUCCESS; } }
至此,执行器项目就开发完成了,启动项目,在执行器管理页面添加该执行器。
新增执行器
执行器添加完成后,须要在任务管理界面添加咱们刚才开发的两个任务,下面以 BEAN 模式方法任务为例:
新增任务
点击保存后,一个定时任务就完成了,是否是很简单呢?
下面启动任务来查看下执行结果,在这里点击“执行一次”,而后查询执行日志,结果以下图:
执行日志
能够看到咱们的任务已经成功执行了,至此,Spring Boot 集成 XXL-JOB 任务调度平台就完成了。
Spring Boot 与 XXL-JOB 的集成是否是很简单呢?在这里只是简单地入门,想要了解更多能够看下官方文档:https://www.xuxueli.com/xxl-job。
尚未使用过的能够经过本文快速上手,来实操起来吧!