Spring Boot 集成 XXL

Stella981
• 阅读 571

在开发中需要将已有的定时任务抽离出来,方便管理查看,因此选择集成分布式任务调度平台 XXL-JOB,本文就讲解下 Spring Boot 如何集成 XXL-JOB 任务调度平台。

XXL-JOB 简介

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

下面我们在 Spring Boot 中集成 XXL-JOB 来完成定时任务的编写(本文选择的 XXL-JOB 版本为 2.2.0)。

Spring Boot 集成 XXL-JOB

Spring Boot 集成 XXL-JOB 主要分为以下两步:

  1. 配置运行调度中心(xxl-job-admin)

  2. 配置运行执行器项目(xxl-job-executor)

配置运行调度中心

首先从源码仓库中下载代码,代码地址有两个:

  1. GitHub:https://github.com/xuxueli/xxl-job

  2. Gitee:http://gitee.com/xuxueli0323/xxl-job

下载完之后,在 doc/db 目录下有数据库脚本 tables_xxl_job.sql,执行下脚本初始化调度数据库 xxl_job,如下图所示:

Spring Boot 集成 XXL

可以根据需要修改 xxl-job-admin 的配置文件,主要是修改数据源信息,若需要用到邮件报警功能,需要配置邮箱。

然后启动项目,正常启动后,访问地址为:http://localhost:8080/xxl-job-admin,默认的账户为 admin,密码为 123456,访问后台管理系统后台,界面如下:

Spring Boot 集成 XXL

这样就表示调度中心已经搞定了,下一步就是创建执行器项目。

配置运行执行器项目

创建一个项目,在项目中加入 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

`@Configuration
public 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;
    }
}
`

接下来就可以创建任务了。

编写 JobHandler

在这里主要演示下 Bean 模式的任务,可以基于类和方法进行开发,下面先介绍基于类的开发的任务。

BEAN模式(类形式)

首先创建一个类 BeanClassJobHandler,继承 IJobHandler 实现 execute 方法,然后通过 XxlJobLogger.log 来打印日志。

`@Component
public class BeanClassJobHandler extends IJobHandler {

    @Override
    public ReturnT execute(String param) throws Exception {
        XxlJobLogger.log("bean class jobhandler running...");
        return ReturnT.SUCCESS;
    }
}
`

基于类开发的任务需要手动注册到执行器工厂,具体代码如下所示:

XxlJobSpringExecutor.registJobHandler("beanClassJobHandler", new BeanClassJobHandler());

到此一个任务就开发完成了,下面介绍下基于方法的开发方式:

BEAN模式(方法形式)

基于方法开发的任务比较简单,编写一个方法,并添加 @XxlJob 注解,会自动扫描该任务并注入到执行器容器。

`@Component
public class BeanMethodJobHandler {

    @XxlJob("beanMethodJobHandler")
    public ReturnT beanMethodJobHandler(String param) throws Exception {
        XxlJobLogger.log("bean method jobhandler running...");
        return ReturnT.SUCCESS;
    }
}
`

至此,执行器项目就开发完成了,启动项目,在执行器管理页面添加该执行器。

Spring Boot 集成 XXL

新增执行器

执行器添加完成后,需要在任务管理界面添加我们刚才开发的两个任务,下面以 BEAN 模式方法任务为例:

Spring Boot 集成 XXL

新增任务

点击保存后,一个定时任务就完成了,是不是很简单呢?

下面启动任务来查看下执行结果,在这里点击“执行一次”,然后查询执行日志,结果如下图:

Spring Boot 集成 XXL

执行日志

可以看到我们的任务已经成功执行了,至此,Spring Boot 集成 XXL-JOB 任务调度平台就完成了。

总结

Spring Boot 与 XXL-JOB 的集成是不是很简单呢?在这里只是简单地入门,想要了解更多可以看下官方文档:https://www.xuxueli.com/xxl-job

还没有使用过的可以通过本文快速上手,来实操起来吧!

本文的完整代码在 https://github.com/wupeixuan/SpringBoot-Learnxxl-job-executor 目录下。

最好的关系就是互相成就,大家的点赞、在看、分享、留言就是我创作的最大动力。

参考

https://www.xuxueli.com/xxl-job

https://github.com/wupeixuan/SpringBoot-Learn

本文分享自微信公众号 - 武培轩(wupeixuan404)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Wesley13 Wesley13
2年前
Java日期时间API系列29
  Java开发过程中经常会用到定时任务job的场景,比如定时处理数据报表等问题,开源作业调度框架也非常多,常用的开源作业调度框架有:SpringTask、Quartz和xxljob等。各个框架的具体使用不再这里讨论,这里主要讨论一下其中cron表达式的计算应用,xktime中的应用。1.SpringTask中cron表达式的计算应用
Stella981 Stella981
2年前
SpringBoot集成Schedule任务调度
一、前言:微服务应用中可能会涉及到多个定时任务跨服务同时执行,这里就会涉及到线程生命周期和一致性问题,任务调度器本质上还是单独启动的线程执行,但是生命周期不会随应用的停止而销毁,所以本篇内容只涉及当前应用执行定时任务1、配置启动类!(https://static.oschina.net/uploads/space/2018/060
Easter79 Easter79
2年前
SpringBoot集成Schedule任务调度
一、前言:微服务应用中可能会涉及到多个定时任务跨服务同时执行,这里就会涉及到线程生命周期和一致性问题,任务调度器本质上还是单独启动的线程执行,但是生命周期不会随应用的停止而销毁,所以本篇内容只涉及当前应用执行定时任务1、配置启动类!(https://static.oschina.net/uploads/space/2018/060
汪昭 汪昭
6个月前
Disjob—分布式任务调度框架
简介Disjob是一款分布式的任务调度框架,天然为支持分布式长任务执行而设计,它除了具备常规的任务调度功能外,还提供:任务拆分及分布式并行执行、暂停及取消运行中的任务、恢复执行被暂停的任务、任务执行失败重试、保存任务的执行快照(Savepoint)、任务依
京东云开发者 京东云开发者
6个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这