Spring Boot 集成 XXL-JOB 任务调度平台

https://www.bilibili.com/video/BV1WT4y1U7Vr?spm_id_from=333.999.0.0

在开发中需要将已有的定时任务抽离出来,方便管理查看,因此选择集成分布式任务调度平台 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 主要分为以下两步:

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

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

配置运行调度中心

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

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

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

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

可以根据需要修改 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。

@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<String> 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<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。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容