Spring boot下,集成任务调度中心(XXL-JOB)
一、使用背景
目前项目中,采用的是微服务框架,由于在微服务中,存在需要定时的任务。但如果定时任务维护在每个微服务下,当微服务部署多个实例的情况下,会出现定事任务多次执行的情况。并且在解决问题的基础上,希望能够实现动态修改任务的定时时间,可以通过页面对定时任务进行控制。
二、XXL-JOB简单介绍
首先,XXL-JOB是一个轻量级分布式任务调度平台,内容采用了Quartz定时框架实现,服务之间通信通过RPC的方式实现。
其次,在功能方面:
- 支持通过web页面对任务进行增删改查操作
- 支持动态修改任务状态、启动、停止等,即时生效。
- 支持多种阻塞处理策略,如串行、丢弃后续调度、覆盖之前调度
- 支持超时控制、失败重试、邮件报警等处理
- ......
详情可参考官方网站:http://www.xuxueli.com/xxl-job
三、服务端实现过程
1、XXL-JOB源码下载:
github地址:https://github.com/xuxueli/xxl-job
其中,xxl-job-core为核心代码块,xxl-job-admin为任务调度中心管理模块,部署的话,部署xxl-job-admin即可。
2、数据库创建:
sql文件为:xxl-job/doc/db/tables_xxl_job.sql,在mysql数据库中执行该sql,能生成新的数据库xxl-job及相关的数据库表xxl_job_*。
目前从源码来看,暂时只支持mysql数据库,如需支持其他数据库,可在源码上进行相关的修改:如mybatis的配置、sql语句等。
3、xxl-job-admin模块配置修改:
修改xxl-job-admin下的配置文件:application.properties
在配置文件中,主要需要修改数据库地址(spring.datasource.url)、用户名(spring.datasource.username)、密码的配置(spring.datasource.password)为实际的部署环境。
端口号(server.port)默认为8080,可修改。
访问地址(server.context-path)默认为xxl-job-admin,可修改。
4、启动xxl-job-admin微服务:
启动成功后,可通过访问http://localhost:8080/xxl-job-admin来对任务调度中心进行访问。
用户名密码默认为:admin/123456
四、客户端(微服务模块)实现过程:
1、引用依赖:
pom.xml中,增加依赖:
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.0.2</version>
</dependency>
2、修改配置文件:
本文采用yml配置文件,增加配置如下:
xxl:
job:
admin:
addresses: http://localhost:8080/xxl-job-admin
executor:
ip:
port: 9999
logpath: /data/applogs/xxl-job/jobhandler
appname: plat-job
accessToken:
其中ip可不填,会自动识别注册。
3、编写Configuration类
此处需要注意版本差异,由于服务器端采用的是V2+,客户端也需要采用V2+。不然会有异常。
V2+的配置类代码如下:
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class XxlJobConfig { @Value("${xxl.job.admin.addresses}")
private String adminAddresses; @Value("${xxl.job.executor.appname}")
private String appName; @Value("${xxl.job.executor.ip}")
private String ip; @Value("${xxl.job.executor.port}")
private int port; @Value("${xxl.job.accessToken}")
private String accessToken; @Value("${xxl.job.executor.logpath}")
private String logPath; private int logRetentionDays=-1; @Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobSpringExecutor xxlJobExecutor() {
System.out.println(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppName(appName);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor;
}
}
4、编写Handler类(实际处理任务):
代码如下所示:
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
@JobHandler(value="TestHandler")
@Component
public class TestHandler extends IJobHandler { @Override
public ReturnT<String> execute(String param) throws Exception {
System.out.println("执行了TestHandler一次");
return SUCCESS;
}
}
在上面代码中,Handler的命名为“TestHandler”,此命名需要是唯一的,后续再服务器中配置会用到。
5、启动客户端(微服务):
启动成功后,会自动在服务器中,增加一个名为【plat-job】的执行器,用来执行定时任务。
五、服务器端页面中进行配置:
1、修改执行器:
访问服务器页面登录成功后,点击执行器管理,如图:

对执行器进行编辑,注册方式改为【手动录入】,机器地址写入客户端(微服务)具体的ip:port后,点击保存。
2、任务管理编辑:
点击【任务管理】页签【新增】按钮,执行器选择plat-job,JobHandler编写为【TestHandler】,Cron为定时计划,如图所示:

保存后,可点击【执行】按钮,查看是否调用了客户端的Handler处理。在此不再演示。如可执行,则点击【启动】按钮,会在定时计划内,再次调用Handler处理。
同时,在对任务的Cron进行修改、保存后,会动态的更新定时计划,实现了项目中的期望。
由于每个微服务的ip和port可以在执行器的机器地址中,通过逗号分隔的方式,可增加多个客户端的地址,则解决了项目中多实例的问题。
Spring boot下,集成任务调度中心(XXL-JOB)的更多相关文章
- spring boot下使用logback或log4j生成符合Logstash标准的JSON格式
spring boot下使用logback或log4j生成符合Logstash标准的JSON格式 一.依赖 由于配置中使用了json格式的日志输出,所以需要引入如下依赖 "net.logst ...
- Spring Boot下Druid连接池+mybatis
目前Spring Boot中默认支持的连接池有dbcp,dbcp2, hikari三种连接池. 引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连 ...
- Spring Boot:集成Druid数据源
综合概述 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据 ...
- shiro 和 spring boot 的集成
1 添加依赖 使用 shiro-spring-boot-web-starter 在 spring boot 中集成 shiro 只需要再添加一个依赖 <dependency> <gr ...
- Spring Boot快速集成kaptcha生成验证码
Kaptcha是一个非常实用的验证码生成工具,可以通过配置生成多样化的验证码,以图片的形式显示,从而无法进行复制粘贴:下面将详细介绍下Spring Boot快速集成kaptcha生成验证码的过程. 本 ...
- [转帖]spring boot项目集成jacoco
小试牛刀:spring boot项目集成jacoco 2019-03-28 20:14:36 zyq23333 阅读数 509 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议, ...
- Java | Spring Boot Swagger2 集成REST ful API 生成接口文档
Spring Boot Swagger2 集成REST ful API 生成接口文档 原文 简介 由于Spring Boot 的特性,用来开发 REST ful 变得非常容易,并且结合 Swagg ...
- 在spring环境下集成ActiveMQ
1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇ActiveMQ入门实例中我们实现了消息的异步传送,这篇博文将如何在spr ...
- 转-Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合
Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合 http://blog.csdn.net/balabalayi/article/detai ...
- 【spring boot】10.spring boot下的单元测试
spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...
随机推荐
- Linux下异常信号
我们介绍一些标准信号的名称以及它们代表的事件.每一个信号名称是一个代表正整数的宏,但是你不要试图去推测宏代表的具体数值,而是直接使用名称.这是因为这个数值会随不同的系统或同样系统的不同版本而不同,但是 ...
- SpringDataJPA入门2
SpringDataJPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系型数据库的映射,此类Java对象成为JPA实体或简称实体.实体通常与底层数据库中的单个关系表相关联 ...
- zookeeper客户端
查看具体结点信息 bash zkServer.sh status 查看哪个结点被选作leader或者followerecho stat|nc 127.0.0.1 2181 测试是否启动了该Server ...
- Jekyll 搭建
Jekyll搭建个人主页 早上昨晚上弄hexo的时候就开始有问题,发现命令有错误!今天早上来就开始把另外建立了仓库,转Jekyll,并不顺利,做了一天了,基本的theme的本地和远端主页可以显示,但当 ...
- [正在学习开发板]分享--- iTOP-4412移植CAN
首先拷贝迅为提供的 libcanjni.tar.gz 压缩包到 android 源代码的"iTop4412_ICS/device/samsung/common"文件夹以下,然后使用 ...
- Android NFC近场通信02----读写卡的准备工作
Android NFC近场通信02----读写卡的准备工作 因为公司接了一个听上去感觉比較NB的项目.给某油田做派工系统 .并由小女子负责Androi ...
- sqoop基本 操作
列出 hive的 全部库 sqoop list-databases --connect jdbc:mysql://localhost --username hive --password hive 列 ...
- 纯C语言实现简单封装继承机制
0 继承是OO设计的基础 继承是OO设计中的基本部分,也是实现多态的基础,C++,C#,Objective-C.Java.PHP.JavaScript等为OO而设计的语言,其语言本身对实现继承提供了直 ...
- Mongodb for PHP教程之入门安装
简介: MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据 ...
- 1 Angular 2 简介与 AngularJS 1.x 历史对比
Angular 2 是一款JavaScript的开源框架,用于协助单一页面应用程序运行.Angular 2 是 AngularJS 1.x 的升级版本,应Web的进化和前端开发的变革还有从Angula ...