分布式调度XXL-Job整合Springboot2.X实战操作过程(推荐)

目录
  • 一、定时任务的使用场景和常见的定时任务
  • 二、如何选择哪一个分布式任务调度平台
  • 三、xxl-job的设计思想
  • 四、XXL-Job具有哪些特性
  • 五、XXL-Job实战操作

一、定时任务的使用场景和常见的定时任务

某个时间定时处理某个任务、发邮件、短信、消息提醒、订单通知、统计报表等

定时任务划分

单机定时任务:
单机的容易实现,但应用于集群环境做分布式部署就会带来重复执行
解决方案有很多比如加锁、数据库等,但是增加了很多非业务逻辑
分布式调度:
把需要处理的计划任务放入到统一的平台,实现集群管理调度与分布式部署的定时任务 叫做分布式定时任务
支持集群部署、高可用、并行调度、分片处理

常见定时任务:
单机:Java自带的java.util.Timer类配置比较麻烦,时间延后问题
单机:ScheduledExecutorService
是基于线程池来进行设计的定时任务类,在这里每个调度的任务都会分配到线程池里的一个线程去执行该任务,并发执行,互不影响

单机:SpringBoot框架自带
SpringBoot使用注解方式开启定时任务
启动类里面 @EnableScheduling开启定时任务,自动扫描
定时任务业务类 加注解 @Component被容器扫描
定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次

分布式任务调度框架 Elastic-Job/XXL-Job/Quartz

二、如何选择哪一个分布式任务调度平台

Elastic-job和XXL-JOB对比图

XXL-Job和Elastic-Job都具有广泛的用户基础和完善的技术文档,都可以满足定时任务的基本功能需求
xxl-job侧重在业务实现简单和管理方便,容易学习,失败与路由策略丰富, 推荐使用在用户基数相对较少,服务器的数量在一定的范围内的场景下使用

elastic-job关注的点在数据,添加了弹性扩容和数据分片的思路,更方便利用分布式服务器的资源, 但是学习难度较大,推荐在数据量庞大,服务器数量多的时候使用

三、xxl-job的设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑“调度中心”负责发起调度请求
将任务抽象成分散的JobHandler,交由“执行器”统一管理
“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。
因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性

架构系统组成:

调度中心
负责管理调度的信息,按照调度的配置来发出调度请求
支持可视化、简单的动态管理调度信息,包括新建、删除、更新等,这些操作都会实时生效,同时也支持监控调度结果以及执行日志。
执行器
负责接收请求并且执行任务的逻辑。任务模块专注于任务的执行操作等等,使得开发和维护更加的简单与高效

架构图(图片来源是xxl-job官网)

四、XXL-Job具有哪些特性

调度中心HA(中心式):调度采用了中心式进行设计,“调度中心”支持集群部署,可保证调度中心HA
执行器HA(分布式):任务分布式的执行,任务执行器支持集群部署,可保证任务执行HA
触发策略:有Cron触发、固定间隔触发、固定延时触发、API事件触发、人工触发、父子任务触发
路由策略:执行器在集群部署的时候提供了丰富的路由策略,如:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用LFU、最久未使用LRU、故障转移等等
故障转移:如果执行器集群的一台机器发生故障,会自动切换到一台正常的执行器发送任务调度
Rolling实时日志的监控:支持rolling方式查看输入的完整执行日志
脚本任务:支持GLUE模式开发和运行脚本任务,包括Shell、python、node.js、php等等类型脚本

五、XXL-Job实战操作

搭建XXL-Job相关环境步骤:
创建数据库脚本
部署XXL-Job服务端
客户端项目添加依赖

注意
Client-Server通信,需要网络互通才行
所以不能一个是阿里云ECS,一个是本地电脑
建议:本地电脑安装Docker,或者本地Linux虚拟机安装Docker部署

本博文是直接拉取的源码然后在本地win7打包部署的。

步骤一: 进入GitHub - xuxueli/xxl-job at 2.2.0地址,根项目需求拉取对应版本代码

下载压缩包,这里下载的版本需要跟后面依赖的版本一致,切换到2.2.0版本下载压缩包。

第二步:

下载后再idea中打开

第三步 打开doc文件夹,找到里面的db tables_xxl_job.sql,然后拿到navicat中运行

数据库脚本(使用mysql8)
xxl_job 的数据库里有如下几个表
xxl_job_group:执行器信息表,用于维护任务执行器的信息
xxl_job_info:调度扩展信息表,主要是用于保存xxl-job的调度任务的扩展信息,比如说像任务分组、任务名、机器的地址等等
xxl_job_lock:任务调度锁表
xxl_job_log:日志表,主要是用在保存xxl-job任务调度历史信息,像调度结果、执行结果、调度入参等等
xxl_job_log_report:日志报表,会存储xxl-job任务调度的日志报表,会在调度中心里的报表功能里使用到
xxl_job_logglue:任务的GLUE日志,用于保存GLUE日志的更新历史变化,支持GLUE版本的回溯功能
xxl_job_registry:执行器的注册表,用在维护在线的执行器与调度中心的地址信息
xxl_job_user:系统的用户表

更改刚拉下代码配置中的数据库连接:

本地打包启动:

mvn install

jar -jar win7启动xxl-job服务包

第四步:

访问地址:http://127.0.0.1:8080/xxl-job-admin/ admin/123456

初次进来的运行报表:
以图形化来展示了整体的任务执行情况
任务数量:能够看到调度中心运行的任务数量
调度次数:调度中心所触发的调度次数
执行器数量:在整个调度中心中,在线的执行器数量有多少

第五步 开始跟项目代码整合:

pom.xml依赖引入

 <xxl-job.version>2.2.0</xxl-job.version>
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
            <dependency>
                <groupId>com.xuxueli</groupId>
                <artifactId>xxl-job-core</artifactId>
                <version>${xxl-job.version}</version>
            </dependency>

第六步 新增logback.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/logs/xxl-job/app.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>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>
</configuration>

第七步 application.properties增加配置项

#----------xxl-job配置--------------
logging.config=classpath:logback.xml
#调度中心部署地址,多个配置逗号分隔 "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

#执行器token,非空时启用 xxl-job, access token。需要跟xxl-job-master服务中的同配置一模一样
xxl.job.accessToken=xxxxx.net168
# 执行器app名称,和控制台那边配置一样的名称,不然注册不上去
xxl.job.executor.appname=traffic-app-executor
# [选填]执行器注册:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。
#从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
#[选填]执行器IP :默认为空表示自动获取IP(即springboot容器的ip和端口,可以自动获取,也可以指定),多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务",
xxl.job.executor.ip=
# [选填]执行器端口号:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
#执行器日志文件存储路径,需要对该路径拥有读写权限;为空则使用默认路径
xxl.job.executor.logpath=./data/logs/xxl-job/executor
#执行器日志保存天数
xxl.job.executor.logretentiondays=30

配置图解:

1.上述 配置xxl.job.accessToken=xxxxx.net168的值 和 xxl-job-2.2.0里面的配置xxl.job.accessToken的值需要一模一样

2.xxl.job.executor.appname=traffic-app-executor 执行器的名称

需要跟调度中心执行器名称一模一样,不然注册不上去

properties配置加完后,需要增加一个.java的配置读取类:

package net.wnn.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;
@Configuration
@Slf4j
public class XxlJobConfig {
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @Value("${xxl.job.executor.appname}")
    private String appName;
    @Value("${xxl.job.executor.ip}")
    private String ip;
    @Value("${xxl.job.executor.port}")
    private int port;
    @Value("${xxl.job.accessToken}")
    private String accessToken;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;
    @Bean
    public XxlJobSpringExecutor xxlJobSpringExecutor(){
        log.info("》》》》》这是王姑娘的 xxl job 配置初始化 方法");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

第八步 创建你的第一个XXL-Job分布式调度任务代码:

package net.wnn.job;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import net.wnn.service.TrafficService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TrafficJobHandler {
    @Autowired
    private TrafficService trafficService;
    /**
     * 过期流量包处理
     * @param param
     * @return
     */
    @XxlJob(value = "trafficExpiredHandler",init = "init",destroy = "destroy")
    public ReturnT<String> execute(String param){
        log.info(" execute 任务方法触发成功,删除过期流量包");

        return ReturnT.SUCCESS;
    }
    private void init(){
        log.info(" MyJobHandler init >>>>>");
    private void destroy(){
        log.info(" MyJobHandler destroy >>>>>");
}

这步骤写完之后,需要启动下应用服务,将IP地址注册到xxl-job中,大概启动成功后30S才有。

第九步 :代码写完后,就需要进入客户端进行相关参数的配置了

执行器管理页面:
到xxl-job调度中心里的执行器管理->新增
第一步新增执行器

Appname:是每一个执行器的唯一表示AppName,执行器会以周期性为appname进行注册,为任务调度的时候使用
名称:执行器的名称,因为appname有限制字母与数字等等组成,可读性不强,这个名称就是为了提高执行器的可读性
注册方式:调度中心获取执行器地址的方式
自动注册:执行器自动进行执行器的注册,通过底层的注册表可以动态的发现执行器机器的地址
手动录入:人工手动录入执行器的地址信息,多地址使用逗号进行分割,供调度中心使用
机器地址:“注册方式”为手动录入的时候才能使用,支持人工维护执行器的地址
点击保存后可能要等30S左右才回显示机器的地址

第二步 新建任务管理:

其中JobHandler需要和代码中的@xxljob value一模一样

新建完任务后就惦记保存,然后再列表页面的操作中下拉后选择执行一次:

选择启动模式的话,就是按设定的cron表达式执行: 上述任务设置的是一秒一次

调度成功日志:

运行报表页面:

到这分布式调度XXL-Job就整合完毕啦~

到此这篇关于分布式调度XXL-Job整合Springboot2.X实战操作的文章就介绍到这了,更多相关Springboot2.X整合XXL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springboot2.x+Quartz分布式集群的实现

    生产环境一般都是多节点高可用,Springboot本身自带有定时任务功能,但我们项目需求要求能对定时任务进行增,删,改,查.所以考虑引进Quartz,引入Quartz就需要考虑分布式集群,所以就有了这篇文章. 数据库脚本 Quartz数据库有11张表,既支持Mysql,也支持Oracle Mysql /* Navicat MySQL Data Transfer Source Server : 10.19.34.3_ehr_admin Source Server Version : 50639 S

  • SpringBoot整合Xxl-job实现定时任务的全过程

    目录 前言 一.部署调度中心 1.项目下载 2.初始化数据 3.修改properties配置文件 二.部署SpringBoot项目 1.引入依赖 2.创建配置类 3.修改配置文件 4.创建执行器 5.启动SpringBoot项目 三.通过调度中心进行任务调度 1.添加执行器 2.添加任务 3.任务调度中心发起任务调度 四.小结 总结 前言 ​ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 如果是单机

  • SpringBoot整合Xxl-Job的完整步骤记录

    一.下载Xxl-Job源代码并导入本地并运行 Github地址: https://github.com/xuxueli/xxl-job 中文文档地址: https://www.xuxueli.com/xxl-job/ 1.使用Idea或Eclipse导入 2.执行sql脚本(红色标记处) 3.运行xxl-job-admin(xxl-job后台管理,主要方便管理各种各样的任务) 注意:在运行之前,需要把2的sql脚本执行完毕,并修改数据库连接池. 正常启动,访问地址为:http://localho

  • 分布式调度XXL-Job整合Springboot2.X实战操作过程(推荐)

    目录 一.定时任务的使用场景和常见的定时任务 二.如何选择哪一个分布式任务调度平台 三.xxl-job的设计思想 四.XXL-Job具有哪些特性 五.XXL-Job实战操作 一.定时任务的使用场景和常见的定时任务 某个时间定时处理某个任务.发邮件.短信.消息提醒.订单通知.统计报表等 定时任务划分 单机定时任务:单机的容易实现,但应用于集群环境做分布式部署,就会带来重复执行解决方案有很多比如加锁.数据库等,但是增加了很多非业务逻辑分布式调度:把需要处理的计划任务放入到统一的平台,实现集群管理调度

  • 分布式调度XXL-Job整合Springboot2.X实战操作

    一.定时任务的使用场景和常见的定时任务 二.如何选择哪一个分布式任务调度平台 三.xxl-job的设计思想 ​ 四.XXL-Job具有哪些特性 五.XXL-Job实战操作 一.定时任务的使用场景和常见的定时任务 某个时间定时处理某个任务.发邮件.短信.消息提醒.订单通知.统计报表等 定时任务划分  单机定时任务:    单机的容易实现,但应用于集群环境做分布式部署,就会带来重复执行    解决方案有很多比如加锁.数据库等,但是增加了很多非业务逻辑 分布式调度:      把需要处理的计划任务放入

  • Spring整合Quartz分布式调度的示例代码

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源, 另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调度系统,来协调每个节点执行定时任务. Spring整合Quartz Quartz是一个成熟的任务调度系统,Spring对Quartz做了兼容,方便开发,下面看看具体如何整合: 1.Maven依赖文件 <dependencies> <dependency> <groupId>

  • 分布式医疗挂号系统整合Gateway网关解决跨域问题

    目录 一.Gateway网关简介 二.Gateway使用步骤 步骤1:搭建模块并引入依赖 步骤2:添加配置文件 步骤3:创建启动类 网关初步测试 三.Gateway解决跨域问题 一.Gateway网关简介 API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过API 网关这一层.也就是说,API 的实现方面更多的考虑业务逻辑,而安全.性能.监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性. Spring cloud gateway是spring官方基于Sprin

  • mybatis多对多关联实战教程(推荐)

    MyBatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作 一.创建student.teacher和stu_teach_rel三张张表 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11

  • Spring Boot整合RabbitMQ开发实战详解

    这篇文章主要讲基本的整合.先把代码跑起来,再说什么高级特性. RabbitMQ 中的一些术语 如果你打开 RabbitMQ web 控制台,你会发现其中有一个 Exhanges 不好理解.下面简单说明一下. 交换器(Exchange) 交换器就像路由器,我们先是把消息发到交换器,然后交换器再根据路由键(routingKey)把消息投递到对应的队列.(明白这个概念很重要,后面的代码里面充分体现了这一点) 队列(Queue) 队列很好理解,就不用解释了. 绑定(Binding) 交换器怎么知道把这条

  • SpringCloud Alibaba Nacos 整合SpringBoot Admin实战

    目录 1. Spring Boot Admin 是什么 2. Spring Boot Admin 服务端 2.1. 添加依赖(服务端) 2.2. 配置 application.yml 2.3启动类:AdminServerMain 2.4配置类 :SecuritySecureConfig (直接cp官方文档) 3. Spring Boot Admin 客户端 3.1 客户端依赖 3.2 客户端配置 3.3. 客户端运行 4. Spring Boot Admin 功能 1. Spring Boot

  • springboot快速整合Mybatis组件的方法(推荐)

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 原有Spring优缺点分析 Spring的优点分析 Spring是Java企业版(Java Enterprise Edition,

  • springboot整合redis进行数据操作(推荐)

    redis是一种常见的nosql,日常开发中,我们使用它的频率比较高,因为它的多种数据接口,很多场景中我们都可以用到,并且redis对分布式这块做的非常好. springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作. 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

  • springboot整合apache ftpserver详细教程(推荐)

    一.Apache ftpserver相关简介 Apache FtpServer是100%纯Java FTP服务器.它被设计为基于当前可用的开放协议的完整且可移植的FTP服务器引擎解决方案.FtpServer可以作为Windows服务或Unix / Linux守护程序独立运行,也可以嵌入Java应用程序中.我们还提供对Spring应用程序内集成的支持,并以OSGi捆绑软件的形式提供我们的发行版.默认的网络支持基于高性能异步IO库Apache MINA.使用MINA,FtpServer可以扩展到大量

随机推荐