Springboot整合xxl-job

197 阅读1分钟

下载xxljob

xxljob源码仓库地址

github

gitee

添加maven依赖

 <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->  <dependency>      <groupId>com.xuxueli</groupId>      <artifactId>xxl-job-core</artifactId>      <version>${最新稳定版本}</version>  </dependency>

环境

  • Maven3+
  • Jdk1.8+
  • Mysql5.7+

开始部署xxljob

  • 执行sql文件 初始化数据库

image.png

  • 修改配置文件 文件路径 /xxl-job/xxl-job-admin/src/main/resources/application.properties 修改端口等等,如下:

image.png

  • 然后启动xxl-job-admin中的main 或者打包后用jar执行都可,这里选用执行main,执行成功后如下:

image.png

image.png

这样调度中心就算部署成功了。

开始创建执行器

其实这个springboot项目 原xxl-job-master 里就已经集成了 我这里单独再重新创建 配置可以参考原 xxl-job-exector-sample-springboot项目

image.png

  • 新建springboot项目

image.png

  • 引入 xxl-job-core 依赖 我这里采用2.3.0版本
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.0</version>
</dependency>
  • 编写配置文件

image.png

SimpleXxlJob(定时作业业务逻辑类)

package com.example.demo.jobhandler;

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;




/**
 * @Title: SimpleXxlJob
 * @Package com.example.demo.jobhandler
 * @Description: TODO
 * @Author: yangy
 * @Date: 2022/10/11 10:28
 **/

@Component
public class SimpleXxlJob {

    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("printJobHandler")
    public void printJobHandler() throws Exception {
        System.out.println("每1分钟执行一次!");
    }



}

XxlJobConfig(执行器配置类)

package com.example.demo.jobhandler;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@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();
     */


}

然后启动main 如下:这样执行器就算启动成功了

image.png

配置定时作业

添加执行器

  • 在执行器管理页面新增刚才启动的执行器就可以了,注册方式选自动,appName就是application.properties里配置的xxl.job.executort.appname

image.png

添加定制作业

  • 运行模式选择BEAN JobHandler和业务代码里一致

image.png

  • 添加完成后 就可以启动并执行了,点击执行一次后,该作业就会立即执行一次:

image.png

  • 点击查询日志 可以查看该作业执行的历史记录

image.png

注意事项

关于传参的问题,在定时任务的创建和执行一次调用的时候都会有任务参数的填写,这就是我们需要传递到代码中的参数。

关于接收参数的问题,在2.3.0版本及其以上的参数接收发生了改变,用以下方式进行接收参数,且只能传递String类型,如果是其它类型参数,需要自己在代码中进行对应的转换

参数获取如下:

String param = XxlJobHelper.getJobParam(); // 接收参数代码

修改业务代码后,打印传递的参数: image.png

总结

xxl-job是一个轻量级的分布式调度框架,拆箱即用,并且对接简单,并且支持多种执行策略,同时也支持shell和Python等脚本执行,后续可以慢慢研究。