集成xxl-job定时任务【入门】

333 阅读4分钟

一、前言

由于SpringBoot自带的定时任务有诸多缺点,例如调度任务的程序是分布式的,需要我们在程序中实现分布式锁,有诸多的弊端,所以选择集成 xxl-job 来实现定时任务!

二、运行xxl-job服务端

2.1 拉取代码

gitee地址:

gitee.com/xuxueli0323…

我们将该代码下载下来,可以看到下面的目录,最关键的是 xxl-job-admin(使用的模块),如果没有相关依赖可以将 xxl-job-core 模块使用maven进行install打包即可(打包完成版本为xxl-job-core-2.4.0-SNAPSHOT.jar),剩下的 xxl-job-executor-samples 则是官方集成的一个简易案例(我们可以进行参考)!

2.2 运行sql文件

我们在数据库中运行位于doc.db中的SQL脚本,就能够在数据库中创建xxl_job的数据库以及相关的表!

运行效果:

image.png

2.3 修改配置文件

修改 xxl-job-admin 项目中的 application.properties 配置文件!

image.png

可修改端口号,及数据库配置

有需求也可进行邮箱配置

image.png

2.4 登录首页

登录地址: http://127.0.0.1:9000/xxl-job-admin/toLogin

用户名: admin

密 码: 123456

三、SpringBoot项目集成

注意: 我们的业务模块具体如何进行集成和使用,可以通过官方案例来进行初步了解!

image.png

3.1 新建ape-common-job模块

image.png

3.2 引入依赖

<dependencies>
    <!-- xxljob相关依赖 -->
    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <!-- 不写版本,在maven打包的时候会报错 -->
        <version>2.3.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    
    ```
    <!--Mac的M1芯片导致的启动报错(Windows系统或者Linux系统可能不需要)-->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-resolver-dns-native-macos</artifactId>
        <version>4.1.75.Final</version> <!--版本号自己切-->
        <classifier>osx-aarch_64</classifier>
    </dependency>
    
    <!--仅使用springboot的注解功能 引入该注解-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
</dependencies>

注意: 可以使用我们自己install的xxl-job-core包,也可以使用maven引入公网仓库中包含的xxl-job-core包(由于install在本地,会导致在公司中开发其他人缺少该包,所以还是建议使用公网仓库中的)

3.3 编写配置文件

在业务模块ape-user中引入ape-common-job模块

先观察官方案例提供的配置文件内容

image.png

我们同样在user模块中配置

xxl:
  job:
    admin:
      addresses: http://localhost:9000/xxl-job-admin #【调度中心部署地址】
    accessToken: default_token #【执行器通讯TOKEN】
    executor:
      appname: ape-frame #【执行器名称】
      address: #【执行器地址】 优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址
      ip: localhost #【执行器ip】 默认为空表示自动获取IP
      port: 9999 #【执行器端口号】 小于等于0则自动获取;默认端口为9999
      # 设置xxljob输出的本地日志地址
      logpath: C:\Users\86173\Desktop\code\xxl-job
      logretentiondays: 30 #【执行器日志文件保存天数】 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;

3.4 编写XxlJobConfig

在ape-common-job模块下新建config.XxlJobConfig类

将官方案例中的core.config.XxlJobConfig复制即可

package com.ssm.job.config;

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();
     */


}

3.5 执行器配置

第一步: 新增执行器

注意: AppName根据前面配置文件中设置的进行填写!

第二步: 自动注册,进行查看

四、使用xxl-job创建定时任务

4.1 编写定时任务SampleXxlJob类

在业务模块user中创建自己的定时任务!

可将官方案例中提供的service.jobhandle.SampleXxlJob复制下来,只保留简单案例

package com.ssm.user.job;
import com.alibaba.fastjson.JSON;
import com.ssm.user.entity.po.UserPo;
import com.ssm.user.service.UserService;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

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

    @Autowired
    private UserService userService;
    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler") 
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("XXL-JOB, Hello World.");

        for (int i = 0; i < 5; i++) {
            XxlJobHelper.log("beat at:" + i);
            UserPo userPo = userService.queryById(6L);
            XxlJobHelper.log("user" + JSON.toJSONString(userPo));
        }
        // default success
    }

}

4.2 新增任务管理

image.png

  • 调度类型 可选择定时任务执行的规则
  • 任务配置 JobHandler为定时任务SampleXxlJob类@XxlJob里的内容

4.3 运行定时任务

重启服务后,在 任务管理 中操作栏点击操作一次,可通过查询日志快速定位到该任务对应的日志信息。

image.png

image.png