xxl-job实现分布式任务调度

什么是xxl-job

       XXL-Job 是一个基于分布式任务调度框架的开源平台,它基于分布式架构,通过协调任务调度和任务执行器的方式来实现任务调度和执行。架构如图:

1. 原理:

   - 调度中心:XXL-Job 调度中心是任务的管理与调度核心,负责任务的创建、修改、删除和调度等操作。

   - 执行器:执行器是任务的执行容器,可以独立运行在不同的节点上。执行器负责接收任务调度中心分配的任务,并进行执行。执行器将任务执行结果返回给调度中心,并进行状态上报和心跳维持。

2. 作用:

   - 任务调度:XXL-Job 提供了任务调度功能,可以按照预定的时间或条件执行任务,如定时执行、Cron 表达式调度、固定频率调度等。通过调度中心的管理和调度,可以灵活地控制任务的执行。

   - 任务管理:XXL-Job 提供了任务的创建、修改、删除等管理功能,可以方便地对任务进行管理和配置。通过 Web 控制台可以轻松地对任务进行操作。

   - 任务执行监控:XXL-Job 提供了任务执行监控功能,可以查看任务的执行状态、执行日志和结果。它还支持统一的任务查看、日志查询和定时报警功能,便于排查任务执行失败并进行及时处理。

   - 分布式任务调度:XXL-Job 支持在分布式环境中进行任务调度,并提供了注册中心作为任务执行器的管理和协调中心。可以实现任务的分布调度和负载均衡。

        总的来说,XXL-Job 的原理是通过调度中心、执行器和注册中心的协作来实现任务的调度和执行。它的作用是提供灵活的任务调度功能、便捷的任务管理和执行监控,并支持分布式环境下的任务调度和协调。

实现分布式任务调度

     从githu拉取xxl-job:

git clone https://github.com/xuxueli/xxl-job.git

      启动xxl-job-admin(调度中心)

        使用idea打开xxl-job:

         从项目中找到tables_xxl_job.sql,并执行其中的sql,执行后会在MySQL中创建xxl_job库以及相关配置表:

        修改xxl-job-admin配置文件application.properties:

        主要修改数据库连接username和passwrod,以及端口(可以自定义也可以使用默认端口):

        找到XxlJobAdminApplication.java 运行xxl-job-admin:

 

        新建执行器(xxl-job-executor)

        pom文件:

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- 如果你的父项目是本地文件系统中的一个标准 Maven 项目,则可以使用相对路径 -->
    </parent>

    <groupId>org.example</groupId>
    <artifactId>xxl-job-executor</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>xxl-job-executor</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.4.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

        JobExecutorApplication.java

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Hello xxl-job!
 */
@SpringBootApplication
public class JobExecutorApplication {
    public static void main(String[] args) {
        SpringApplication.run(JobExecutorApplication.class, args);
    }
}

        添加xxl-job相关配置XxlJobConfig.java:

package org.example.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 static final Logger log = 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() {
        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);

        return xxlJobSpringExecutor;
    }

}

        添加调度任务HelloJobHandler

package org.example.handler;

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

@Component
public class HelloJobHandler {
    private final static Logger log = LoggerFactory.getLogger(HelloJobHandler.class);

    @XxlJob("helloJob")
    public ReturnT<Object> helloJob(String param) {
        // job 处理逻辑
        log.info("hello xxl-job,current-time:" + System.nanoTime());
        // 返回值
        return new ReturnT<>(200);
    }

}

        项目文件配置

server:
  port: 8081

xxl:
  job:
    admin:
      enable: true
      username: admin
      password: 123456 # xxl-job-admin 默认密码
      addresses: http://172.24.192.1:8079/xxl-job-admin # 调度中心地址
    executor:
      appname: xxl-job-admin
      address: http://172.24.192.1:9999/
      ip:
      port: 9999 # 用来与调度中新通信的端口号
      logretentiondays: 10
    accessToken: default_token

        运行xxl-job-executor

        添加调度任务

        进入xxl-job-admin调度中心控制台:http://127.0.0.1:8079/xxl-job-admin/,默认用户名密码:admin/123456

        新建执行管理器

         新增任务

        上图中,基础配置信息除了执行器外根据跟人具体情况填写.调度配置选择cron,cron表达式可根据实际业务需求自行调整.运行模式选择Bean,jobHandler使用上一步中的@XxlJob内的注解名称.路由策略使用第一个(当有多个执行器时始终使用第一个执行任务).

        执行任务

        这里我执行了两次任务,第一次失败,第二次成功:

        失败原因:第一次执行的时候没有指定执行器地址.需要在执行的时候指定执行器地址:

        或者使用执行器管理中的地址

         调度器后台输出

         其他路由策略

        上面调度任务只实现了始终使用第一个调度器执行的调度方式.其他方式还包括:

  1. LAST(最后一个):固定选择最后一个机器;
  2. ROUND(轮询):;
  3. RANDOM(随机):随机选择在线的机器;
  4. CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
  5. LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
  6. LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
  7. FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
  8. BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
  9. SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

who_am_i__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值