1 定时任务介绍

1.1 什么是定时任务

定时任务时基于给定的时间点、给定的时间间隔或者给定的执行次数自动执行的程序。

任务调度是系统的重要组成部分,同时涉及到多线程并发、运行时间规则定制及解析、线程池的维护等诸多方面的工作。

1.2 应用场景

业务数据同步(线上数据同步到线下,新平台老平台数据的同步),消息通知,业务数据的补偿。

2 xxl-job定时任务

2.1 设计思想

xxl-job是一个轻量级的分布式调度框架,,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

1. 将调度行为抽象形成调度中心平台,其只负责发起调度请求。

2. 将任务抽象成JobHandler,交由执行器统一管理,执行器负责接收调度请求并执行对应的JobHandler中的业务。

3. 调用机制:1) HTTP请求 2) RPC远程调用
无论那种调用方式,首先需要知道执行器的地址ip,端口。所以在执行器中起了一个注册线程。注册线程会向调度中心发送注册请求。调度中心记下后,生成执行器的oline机器地址,方便后期调用执行器。

4. 调度中心调用执行器中的某个具体任务之后,执行器接收到服务之后,进行调度,执行某个具体的方法【JobHandler】,而后将执行结果传给调度中心。

2.2 xxl-job框架的两个核心内容

1. 调度中心

(1) 负责管理调度信息,按照调度配置发出调度请求,本身不承担业务代码。

(2) 调度系统与任务解耦,提高了系统可用性与稳定性,同时调度系统性能不在受限于任务模块。

(3) 支持可视化,简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果及执行日志,支持执行器Failover【故障转移】。

2. 执行器

(1) 负责接受调度请求并执行任务逻辑。

(2) 任务模块专注于任务的执行等操作。

3 springboot集成xxl-job项目实战

3.1 前期准备工作

1 下载源码

源码地址:https://gitee.com/xuxueli0323/xxl-job

2、初始化数据库

 (1) IDEA导入下载好的项目。

 (2) 初始化数据库,打开数据库,运行项目当中sql脚本文件,生成相应的关系表。

 生成的数据库表

注意:

(1)根据需求配置application.properties文件,修改数据库连接的用户名和密码,修改服务端口号,避免端口冲突。

(2)我的服务端口号为8081,启动服务后访问网址:http://localhost:8081/xxl-job-admin/

账户/密码:admin/123456

3.2 项目创建

1 引入核心依赖

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

2 根据需要修改application.yml文件中的配置 

xxl:
  job:
    admin:
      # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
      addresses: http://localhost:8081/xxl-job-admin
    executor:
      # 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
      address:
      # 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
      appname: xxl-job-executor-test
      # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
      ip:
      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
      port: 9999
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logpath: /data/xxl-job-log/jobhandler
      # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
      logretentiondays: 15
    # 执行器通讯TOKEN [选填]:非空时启用;
    accessToken: default_token

 3 创建配置类

在config目录中新建XxlJobConfig类

package com.springboot.config;

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

/**
 * @author Strive
 * @date 2022/4/19 17:26
 * @description
 */
@Slf4j
@Configuration
public class XxlJobConfig {

    @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() {
        log.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);
        log.info("----- xxl-job config end -----");
        return xxlJobSpringExecutor;
    }
}

4  编写xxl-job任务

在com.springboot目录下创建一个task包,在task下创建一个 MingYueScheduledTask类编写任务代码。代码中XxlJob注解后续会在调度中心用到,方便执行器找到该任务进行执行。

package com.springboot.task;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @author Strive
 * @date 2022/4/18 16:19
 * @description 明月定时任务
 */
@Slf4j
@Component
public class MingYueScheduledTask {

    /** 每1分钟扫描一次,扫描发送失败的短信,再次发送 */
    @XxlJob("sendErrorMsg")
    public ReturnT<String> sendErrorMsg() {
        log.info("发送失败的短信,再次发送");

        return ReturnT.SUCCESS;
    }

}

3.3 配置定时任务

1 配置执行器

AppName要与application.yml文件中的参数appname相同,名称自己设置即可,注册方式建议选择自动注册。启动项目后,调度中心会根据配置文件中的端口号自动生成机器地址。

2 配置具体定时任务

在基础配置中只需要注意执行器设置成之前配好的执行器名称,其他按照自己需求配置就好了;在调度配置中调度类型默认,Corn按自己需求配置,我的是每5秒调度一次执行执行任务;任务配置中的JobHandler要使用注解XxlJob中的value值,必须要一样,否则执行器找不到任务执行;高级配置默认就好了。

3 启动定时任务

定时任务启动之后,调度中心每5秒发送一次调度请求,执行器接收到请求自动去执行业务逻辑,将执行结果主动上交给调度中心。将调度中心和执行器都启动后,可以看到在项目控制台上每5秒打印一次 “发送失败的短信,再次发送”。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐