SpringBoot如何集成整合xxl-job任务调度框架

后端 潘老师 5个月前 (11-17) 126 ℃ (0) 扫码查看

本文重点讲解SpringBoot如何集成整合xxl-job任务调度框架,上一小节我们讲了《如何快速搭建xxl-job项目详解》,本节我们主要来继续讲下如何将xxl-job的执行器项目集成整合到我们自己的springboot项目中,其实就是在我们springboot项目中配置自定义的执行器,让我们来一起看下吧!

第1步:配置调度中心

首先你要配置xxl-job的调度中心,这个在上一节文章第2步和第3步中讲过,要先准备好初始化SQL和部署好xxl-job-admin项目,这样我们可以可视化操作,如果没有配置好的,先看上一节内容去部署好。

第2步:SpringBoot集成整合xxl-job

接下来,我们开始步入正题,在我们的springboot项目中集成xxl-job。

2.1:准备一个springboot项目

这个就不详细展开了,想必大家都会创建。

2.2:maven依赖

在springboot项目pom文件中引入了 “xxl-job-core” 的maven依赖,这里我引入的是2.4.0版本:

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.0</version>
</dependency>

2.3 执行器配置

在项目application.properties配置文件中,对执行器进行配置,配置内容及说明如下:

### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
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-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”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

2.4 执行器组件配置

执行器组件配置文件大家其实可以参考源码中的xxl-job-executor-springboot项目,我们在自己项目新建config包,然后新建名为XxlJobConfig的配置类:

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.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.");
        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;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */
}

至此“执行器”项目已经部署结束。

2.3 :执行器集群(可选):

执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。

执行器集群部署时,几点要求和建议:

  • 执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
  • 同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。

第3步:开发第一个任务

xxl-job支持多种模式来创建定时任务,比如GLUE模式、Bean模式任务等,其中Bean模式任务又支持类形式和方法形式,这里我们来演示一下:

3.1 BEAN模式(类形式)

Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类。

  • 优点:不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持,可以参考示例项目 “xxl-job-executor-sample-frameless”;
  • 缺点:
    • 每个任务需要占用一个Java类,造成类的浪费;
    • 不支持自动扫描任务并注入到执行器容器,需要手动注入。

步骤1:执行器项目中,开发Job类:

1、开发一个继承自”com.xxl.job.core.handler.IJobHandler”的JobHandler类,实现其中任务方法。比如我这里新建BeanClassJobHandler:

import com.xxl.job.core.handler.IJobHandler;

public class BeanClassJobHandler extends IJobHandler {
    @Override
    public void execute() throws Exception {
        System.out.println("hello www.panziye.com");
    }
}

2、手动通过如下方式注入到执行器容器。

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

步骤2:调度中心,新建调度任务

后续步骤和 “3.2 BEAN模式(方法形式)”一致,可以看下面参考。

3.2 BEAN模式(方法形式)

Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。

  • 优点:
    • 每个任务只需要开发一个方法,并添加”@XxlJob”注解即可,更加方便、快速。
    • 支持自动扫描任务并注入到执行器容器。
  • 缺点:要求Spring容器环境;

基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。

步骤1:执行器项目中,开发Job方法:

1、任务开发:在Spring Bean实例中,开发Job方法;

2、注解配置:为Job方法添加注解 “@XxlJob(value=”自定义jobhandler名称”, init = “JobHandler初始化方法”, destroy = “JobHandler销毁方法”)”,注解value值对应的是调度中心新建任务的JobHandler属性的值。

3、执行日志:需要通过 “XxlJobHelper.log” 打印执行日志;

4、任务结果:默认任务结果为 “成功” 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 “XxlJobHelper.handleFail/handleSuccess” 自主设置任务结果;

比如潘老师这里开发如下任务:

@Component
public class BeanMethodJobHandler {
    private static Logger logger = LoggerFactory.getLogger(BeanMethodJobHandler.class);


    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("testJobHandler")
    public void testJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello www.panziye.com.");

        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        // default success
    }
}

步骤2:调度中心,新建调度任务

在任务调度页面中新建的任务进行参数配置,运行模式选中 “BEAN模式”,JobHandler属性填写任务注解“@XxlJob”中定义的值;

步骤3:手工执行一次

接下来我们手工执行一下该任务,如下图:

注意:如果你要定时执行,你就点击启动即可,当然你也可以编辑和删除,可以轻松可视化控制任务。

然后查看执行日志发现成功执行了:

其他执行模式

还有一种执行模式更加简单,可以不用写job类,直接在调度中心页面可视化编辑发布任务,也就是GLUE模式,支持Java、Python、Shell等等,这里就不展开讲解了,有兴趣直接去看xxl-job官方文档吧!

总结

以上就是SpringBoot如何集成整合xxl-job任务调度框架的全部内容,希望对你有帮助哦,欢迎长期关注潘子夜个人博客(https://www.panziye.com),学习愉快哦!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/11325.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】