batch->xxl-job定时任务

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

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

业务场景

  1. 业务数据同步(线上数据同步到线下,新平台同步老平台)
  2. 消息通知(花呗账单,信用卡账单等)

什么是定时任务?

  • 定时任务是指:基于给定的时间点、或者给定执行次数“自动执行”的程序。

常见的分布式任务调度框架

  • xxl-job
  • Elastic-job
  • saturn
  • lts
  • TBSchedule
  • cronsum
  • Quartz等

一般定时任务的不足

  • 不支持集群(会导致多次执行)
  • 不支持任务重试(会导致程序执行多次)
  • 不支持动态调用规则(自定义执行时间点,无法改变)
  • 无报警机制(只能通过日志)
  • 不支持生命周期的统一管理
  • 任务数据难以统计

XXL-JOB定时任务

一、工作原理:

设计思想

  1. “调度” 抽象成 “调度中心” 公共平台,自身不承担调度任务,只负责发起调度请求
  2. “任务” 抽象程分散的 JobHandler, 交由执行器统一管理,执行器负责接收调度请求并执行对应的JobHandler中的业务逻辑

因此,“调度” 和 “任务” 可以相互解耦

XXL-Job使用

1. 启动 xxl-job-admin

在这里插入图片描述

2. 开启一个springboot项目,并映入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mfg</groupId>
    <artifactId>xxl-job_first_study</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
            <version>2.7.3</version>
        </dependency>

        <!-- xxl-job定时任务jar -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>
</project>

3. 配置 application.xml

logging:
  level:
    com:
      mfg: [debug,info,error,debug]

  config: classpath:logback.xml

server:
  port: 8081

############### xxl-job 配置 #######################
# xxl.job.admin.addresses:
# xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8080/xxl-job-admin
### xxl.job.accessToken=default_token  ## 对应 xxl-job-admin服务中xxl.job.accessToken配置
    accessToken: default_token
### xxl.job.executor.appname: xxl-job执行器名称,同一个应用多个节点使用同样的名称
    executor:
      appName: xxl-job-executor-mfg
      address:  #执行器自动生成
      ip:    # 执行器ip 执行器自动分配的
      port: 9999 # xxl-job内部 执行器端口
      logPath: /data/applogs/xxl-job/jobhandler # 执行器 日志路径
      logRetentionDays: 30 # xxl-job-executor 执行器日志保留时间

4. 配置 logbak.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

5. 配置 xxl-job

package com.mfg.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;

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses; // xxl-job-admin服务

    @Value("${xxl.job.accessToken}")
    private String accessToken; // xxl-job-admin服务中的登录标签

    @Value("${xxl.job.executor.appName}")
    private String appName; // xxl-job 执行器名称,同一个应用多个节点使用相同的名称

    @Value("${xxl.job.executor.address}")
    private String address; // 执行器注册地址(xxl-job 可以自动生成)

    @Value("${xxl.job.executor.ip}")
    private String ip; // 执行器服务端口信息(executor server-info), 执行器可以自动生成

    @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 xxlJobSpringExecutor(){
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setAppname(appName);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        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();
     */

}

6. 写xxl-job实例

package com.mfg.task;

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

@Component
public class XxlJobDemo {


    @XxlJob(value = "xxlJobDemoTask")
    public ReturnT xxlJobDemoTask(){
        System.out.println("=============>>>>>>>>>>>>>>>>>>>Hello xxl-job !");

        return ReturnT.SUCCESS;
    }
}

并启动springboot这个服务

7. 创建一个执行器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 任务管理

在这里插入图片描述

在这里插入图片描述
这里点击启动
在这里插入图片描述

  1. 管理台自动定时执行

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值