当前位置: 首页 > article >正文

XXLJOB

一、简介

1、概述

XXL-JOB是一个分布式任务调度平台。
任务调度是指基于给定的时间点、给定的时间间隔、给定执行次数 自动的执行任务。

2、为什么使用xxljob?

xxl-job中心式的调度平台轻量级,开箱即用,操作简易,上手快,与SpringBoot有非常好的集成,而且监控界面就集成在调度中心,界面又简洁,对于企业维护起来成本不高,还有失败的邮件告警等等。

二、快速入门

在这里插入图片描述

1、调度中心项目

统一管理调度平台上的调度任务,负责触发调度执行,并且提供任务管理平台。

(1)配置配件 application.properties

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

在这里插入图片描述

(2)启动项目

2、执行器项目

(1)maven依赖

引入了 “xxl-job-core” 的maven依赖

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

(2)配置文件 application.properties

在这里插入图片描述

(3)执行器组件配置

    @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;
    }

(4)启动项目

3、开发第一个任务“Hello World”

(1)执行器管理

在这里插入图片描述

(2)任务管理

点击“任务管理”,点击下图所示“新建”按钮,新建示例任务。点击保存。
在这里插入图片描述

(3)GLUE模式(Java)开发

点击操作中 “GLUE IDE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。
( “GLUE模式(Java)” 运行模式的任务实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务)
在这里插入图片描述
在这里插入图片描述

(4)启动

(5)查看日志

三、集群

部署两个xxljob-admin服务和xxljob服务

(1)第一台

xxljob服务的application.yml文件修改

xxl:
  job:
    accessToken: ''
    admin:
		#两台服务ip、端口
      addresses: http://192.168.100.20:7009/xxl-job-admin,http://192.168.100.30:7009/xxl-job-admin
    executor:
      appname: blade-xxljob
		#本机ip
      ip: 192.168.100.20
      logpath: ../data/applogs/xxl-job/jobhandler
      logretentiondays: -1
      port: 7018

(2)第二台

xxljob服务的application.yml文件修改

xxl:
  job:
    accessToken: ''
    admin:
		#两台服务ip、端口
      addresses: http://192.168.100.20:7009/xxl-job-admin,http://192.168.100.30:7009/xxl-job-admin
    executor:
      appname: blade-xxljob
		#本机ip
      ip: 192.168.100.30
      logpath: ../data/applogs/xxl-job/jobhandler
      logretentiondays: -1
      port: 7018

(3)配置执行器

在这里插入图片描述

四、任务详解

1、BEAN模式(类形式)

Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类。

  • 优点:
    不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持
  • 缺点:
    每个任务需要占用一个Java类,造成类的浪费;
    不支持自动扫描任务并注入到执行器容器,需要手动注入。

(1)执行器项目中,开发Job类

public class DemoHandler extends IJobHandler {
    @Override
    public void execute() throws Exception {
    	//执行代码
        System.err.println("==============");
    }
}

(2)执行器组件手动注入

注意:name要与web中配置的“JobHandler”一致

 XxlJobExecutor.registJobHandler("demoHandler", new DemoHandler());

2、BEAN模式(方法形式)

Bean模式任务,支持基于方法的开发方式,每个任务对应一个方法。

  • 优点:
    每个任务只需要开发一个方法,并添加”@XxlJob”注解即可,更加方便、快速。
    支持自动扫描任务并注入到执行器容器。
  • 缺点:要求Spring容器环境;

(1)执行器项目中,开发Job方法

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


    /**
     * 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);
            TimeUnit.SECONDS.sleep(2);
        }
    }
}

  1. 注解配置:为Job方法添加注解 “@XxlJob(value=“自定义jobhandler名称”, init = “JobHandler初始化方法”, destroy = “JobHandler销毁方法”)”,注解value值对应的web中的JobHandler属性的值。
  2. 执行日志:通过 “XxlJobHelper.log” 打印执行日志;
  3. 任务结果:通过 “XxlJobHelper.handleFail/handleSuccess” 设置任务结果;默认任务结果为 “成功” 状态。

3、GLUE模式(Java)

选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面
在这里插入图片描述

4、参数详解


 1. 基础配置:
    - 执行器
    - 任务描述
    - 负责人
    - 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用英文逗号分隔;
 2. 调度配置:
    - 调度类型:
        无:该类型不会主动触发调度;
        CRON:该类型将会通过CRON,触发任务调度;
        固定速度:该类型将会以固定速度,触发任务调度;按照固定的间隔时间,周期性触发;
    - CRON:触发任务执行的Cron表达式;
    - 固定速度:固件速度的时间间隔,单位为秒;
 3. 任务配置:
    - 运行模式:
        BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 "JobHandler" 属性匹配执行器中任务;
        GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 "groovy" 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务;
        GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "shell" 脚本;
        GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "python" 脚本;
        GLUE模式(PHP):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "php" 脚本;
        GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "nodejs" 脚本;
        GLUE模式(PowerShell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "PowerShell" 脚本;
    - JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHandler”注解自定义的value值;
    - 任务参数:任务执行所需的参数,输入什么,获取的就是什么;     
 4. 高级配置:
    - 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
        FIRST(第一个):固定选择第一个机器;
        LAST(最后一个):固定选择最后一个机器;
        ROUND(轮询):会按照执行器注册地址轮询分配任务;
        RANDOM(随机):随机选择在线的机器;
        CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
        LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
        LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
        FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
        BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
        SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
    - 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。
    - 调度过期策略:
        - 忽略:调度过期后,忽略过期的任务,从当前时间开始重新计算下次触发时间;
        - 立即执行一次:调度过期后,立即执行一次,并从当前时间开始重新计算下次触发时间;
    - 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;
        单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
        丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
        覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
    - 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;
    - 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;

问题

1、什么事GLUE模式

2、调度器无法自动注册

3、ThreadPoolExecutor

4、stmp协议发送邮箱

分布式结构就是,一个完整的系统按照业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在Web容器中,他们之间通过RPC方式通信。


http://www.kler.cn/a/17811.html

相关文章:

  • Bugku CTF_Web——文件上传
  • [运维][Nginx]Nginx学习(1/5)--Nginx基础
  • 爱普生SG-8200CJ可编程晶振在通信设备中的应用
  • 【数据结构】交换排序——冒泡排序 和 快速排序
  • 「Py」Python基础篇 之 Python都可以做哪些自动化?
  • 微服务day07
  • 知识变现海哥|这3种课程定价最容易爆单
  • asp.net+sqlserver企业财务管理系统
  • 【Mybatis】增删改查
  • 北斗导航 | 基于差分法的周跳探测(matlab 代码)
  • android pdf框架
  • unity航点寻径
  • js中对象和数组的都是如何解构的
  • 二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)
  • Java学习之Swing图形界面
  • 关于面试官问Qt Connect的链接方式和类型问题
  • jQuery -- 常用API(下)
  • 《Netty》从零开始学netty源码(五十二)之PoolThreadCache
  • SpringBoot整合FreeMarker
  • 使用zabbix监控Windows指定服务| zabbix Windows service filter
  • 【网络】4万字细品TCP协议
  • yolov8 OpenCV DNN 部署 推理报错
  • 科大版中国版ChatGPT来啦!抢先体验
  • 还能这么玩?清华给 ChatGPT 做逆向,发现了 ChatGPT 的进化轨迹!
  • 记一次产线打印json导致的redis连接超时
  • 【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效