SpringBoot整合Xxl-Job的完整步骤记录

一、XXL-JOB概述

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

二、快速入门

2.1 下载Xxl-Job源代码并导入本地并运行

Github地址:
https://github.com/xuxueli/xxl-job

中文文档地址:
https://www.xuxueli.com/xxl-job/

1.下载Xxl-Job源代码,解压缩使用idea导入
2.打开doc,找到sql文件,在mysql中运行该脚本文件
SpringBoot整合Xxl-Job的完整步骤记录_第1张图片
3.打开xxl-job-admin,修改port和数据库配置修改为自己的配置
SpringBoot整合Xxl-Job的完整步骤记录_第2张图片
如果已经正确进行上述配置,可将项目编译打包部署

4.运行xxl-job-admin(xxl-job后台管理,主要方便管理各种各样的任务)

注意:在运行之前,需要把2的sql脚本执行完毕,并修改数据库连接池。

正常启动,调度中心访问地址为:http://localhost:8080/xxl-job-admin(该地址执行器将会使用到,作为回调地址)

效果图,如下所示:
SpringBoot整合Xxl-Job的完整步骤记录_第3张图片
用户名默认为admin

密码为123456

输入后,进入这个界面,如图:
SpringBoot整合Xxl-Job的完整步骤记录_第4张图片
这样就表示Xxl-Job成功运行了。确保运行没问题后,就可以开始下一步。

2.2 添加执行器

Xxl-Job源代码就一个Example,可以复用过来,你也可以选择自己新建项目,新建项目可以在Xxl-Job基础上,也可以放在其它项目中

三、springboot进行整合

3.1 添加依赖

如果使用maven仓库:
pom:

<dependency>
    <groupId>com.xuxueligroupId>
    <artifactId>xxl-job-coreartifactId>
    <version>2.3.0version>
dependency>

如果使用gradle仓库:

implementation('com.xuxueli:xxl-job-core:2.3.0')

3.2 配置yml

xxl:
  job:
    accessToken:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
    executor:
      appname: xxl-job-executor-sample/
      ip:
      port: 9900
      logpath: /var/log/hwariot/hwariot-mixing-station-data/xxl-job/jobhandler/
      logretentiondays: -1

accessToken:执行器通讯[选填],非空时启用

addresses:调度中心地址[选填],如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调",为空则关闭自动注册

appname:执行器 [选填],执行器心跳注册分组依据,为空则关闭自动注册

ip:默认为空表示自动获取,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用,地址信息用于 “执行器注册” 和
“调度中心请求并触发任务”

port:执行器端口号 [选填],小于等于0则自动获取,默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口

logpath:执行器运行日志文件存储磁盘路径 [选填] ,需要对该路径拥有读写权限,为空则使用默认路径

logretentiondays:执行器日志保存天数 [选填] ,值大于3时生效,启用执行器Log文件定期清理功能,否则不生效

3.3 执行器配置

  • 执行器组件配置信息位置:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
package com.hwariot.api.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * hwariot-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
@ComponentScan(basePackages = "com.hwariot.api.task")
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @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;

    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Resource
    private InetUtils inetUtils;


//    @Bean(initMethod = "start", destroyMethod = "destroy")
    @Bean
    public XxlJobSpringExecutor hwariotJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appName);
        if (StringUtils.isBlank(ip)) {
            ip = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
        }
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }
}

注意:
在低版本的 xxl-job 中, 初始化 XxlJobSpringExecutor 执行器需要在 @Bean 中加上 initMethod = “start”, destroyMethod = “destroy”。
但是在高版本的 xxl-job(如 2.3.0)则需要删除 initMethod = “start”, destroyMethod = “destroy”

3.4 这时配置已经做好了,可以编写定时任务了

package com.hwariot.api.task;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * xxl-job开发示例
 * @author qzz
 *
 * 开发步骤:
 *  *      1、任务开发:在Spring Bean实例中,开发Job方法;
 *  *      2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
 *  *      3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
 *  *      4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
 *  *
 */
@Component
@Slf4j
public class TestHandler {

    @XxlJob(value = "TestHandler")
    public boolean demoJobHandler(){
        log.info("定时任务开始 job start");
        Long startTime  = System.currentTimeMillis();
        testHandler();
        Long endTime  = System.currentTimeMillis();
        log.info("定时任务开始 job end, cost: {} ms"+(endTime - startTime));
        return XxlJobHelper.handleSuccess();
    }

    /**
     * 定时任务要执行的业务逻辑
     */
    public void testHandler() {
        System.out.println("hello world");
    }
}

3.5 启动项目

四、结合Xxl-Job后台系统增加定时任务

4.1 配置执行器

SpringBoot整合Xxl-Job的完整步骤记录_第5张图片
执行器地址为(与application.yml配置文件里的执行器地址需要保持一致,否则会注册失败,导致任务执行不了。

4.2 添加任务

SpringBoot整合Xxl-Job的完整步骤记录_第6张图片

4.3 执行

可以点击“执行一次”,也可以点击“启动”实时执行。
SpringBoot整合Xxl-Job的完整步骤记录_第7张图片

任务执行成功的标志:
SpringBoot整合Xxl-Job的完整步骤记录_第8张图片

到这里,spring boot整合xxl-job已经可以上线使用了

五、问题总结

5.1 xxl-job-admin 启动失败

失败原因:ERROR c.x.job.core.util.XxlJobRemotingUtil - Connection refused: connect

SpringBoot整合Xxl-Job的完整步骤记录_第9张图片
解决方法:我们切换下启动类,就可以正常启动了

5.2 项目启动报Command line is too long

报错:Error running ‘Application‘: Command line is too long. Shorten comm

解决方法:
1.选择报错的启动类,然后在Edit Configurations中找到他
SpringBoot整合Xxl-Job的完整步骤记录_第10张图片
2.展开Environment,Shorten command line 选择 JAR manifest,点击Apply,再点击OK.
SpringBoot整合Xxl-Job的完整步骤记录_第11张图片
此时即可正常启动。

5.3 项目启动报错:Exception in thread “Thread-13” java.net.BindException: Address already in use: bind

在这里插入图片描述
看起来像是地址被占用,实际是新版本配置类中不需要在Bean中加属性了,直接注释@Bean即可
SpringBoot整合Xxl-Job的完整步骤记录_第12张图片

你可能感兴趣的:(SpringBoot,java,spring,boot,java,intellij-idea)