springcloud--xxl-job

news2024/11/15 18:36:23

xxl-job

虽然java自带定时器,但是在springcloud内,如果对多个模块进行统一任务调度,这是自带的定时器就显得不够用,这时就可以使用xxl-job。

xxl-job是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
在这里插入图片描述

特点

1、简单:支持通过 Web 页面对任务进行 CRUD 操作,操作简单,一分钟上手;
2、动态:支持动态修改任务状态、启动 / 停止任务,以及终止运行中任务,即时生效;
3、调度中心 HA(中心式):调度采用中心式设计,“调度中心” 自研调度组件并支持集群部署,可保证调度中心 HA;
4、执行器 HA(分布式):任务分布式执行,任务 “执行器” 支持集群部署,可保证任务执行 HA;
5、注册中心:执行器会周期性自动注册任务,调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
7、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性 HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
8、故障转移:任务路由策略选择 “故障转移” 情况下,如果执行器集群中某一台机器故障,将会自动 Failover 切换到一台正常的执行器发送调度请求。
9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
13、分片广播任务:执行器集群部署时,任务路由策略选择 “分片广播” 情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务;
14、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
15、事件触发:除了 “Cron 方式” 和 “任务依赖方式” 触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的 API 服务,可根据业务事件灵活触发。
16、任务进度监控:支持实时监控任务进度;
17、Rolling 实时日志:支持在线查看调度结果,并且支持以 Rolling 方式实时查看执行器输出的完整的执行日志;
18、GLUE:提供 Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持 30 个版本的历史版本回溯。
19、脚本任务:支持以 GLUE 模式开发和运行脚本任务,包括 Shell、Python、NodeJS、PHP、PowerShell 等类型脚本;
20、命令行任务:原生提供通用命令行任务 Handler(Bean 任务,“CommandJobHandler”);业务方只需要提供命令行即可;
21、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行,多个子任务用逗号分隔;
22、一致性:“调度中心” 通过 DB 锁保证集群分布式调度的一致性,一次任务调度只会触发一次执行;
23、自定义任务参数:支持在线配置调度任务入参,即时生效;
24、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
25、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
26、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
27、推送 maven 中央仓库:将会把最新稳定版推送到 maven 中央仓库,方便用户接入和使用;
28、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等;
29、全异步:任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰,理论上支持任意时长任务的运行;
30、跨语言:调度中心与执行器提供语言无关的 RESTful API 服务,第三方任意语言可据此对接调度中心或者实现执行器。除此之外,还提供了 “多任务模式” 和 “httpJobHandler” 等其他跨语言方案;
31、国际化:调度中心支持国际化设置,提供中文、英文两种可选语言,默认为中文;
32、容器化:提供官方 docker 镜像,并实时更新推送 dockerhub,进一步实现产品开箱即用;
33、线程池隔离:调度线程池进行隔离拆分,慢任务自动降级进入 “Slow” 线程池,避免耗尽调度线程,提高系统稳定性;
34、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
35、权限控制:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;

使用

到官网或者码云拿到xxl-job-admin模块代码,在对应数据库创建数据库表,运行项目中的doc中db下的数据库文件tables_xxl_job.sql
在这里插入图片描述
admin模块就是对应xxl-job的业务表的增删改查。
core对应xxl-job的业务执行逻辑。
调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址),默认登录账号 “admin/123456”。

自定义添加执行器

用调度中心的网页添加执行器、定时任务是非常简单的,这里不做多解释,傻瓜式操作罢了。

如果是项目内使用呢,还可以使用网页创建吗,这显然不行。接下来简绍一下自定义。

自定义模块:
在这里插入图片描述
自定义模块配置:需要根据自己部署的admin模块地址来修改
在这里插入图片描述
重写增删改查:

package com.cetc.xxljob.controller;

import com.cetc.common.core.web.domain.ResponseResult;
import com.cetc.xxljob.api.model.rq.XxlJobInfoRq;
import com.cetc.xxljob.domain.XxlJobInfo;
import com.cetc.xxljob.service.XxlJobService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/job")
public class XxlJobController {

    @Autowired
    XxlJobService jobService;

    @ApiOperation("新增任务")
    @PostMapping("/addJob")
    public ResponseResult addJobInfo(@RequestBody @Validated XxlJobInfoRq rq) {
        return jobService.addJobInfo(rq);
    }

    @ApiOperation("更新任务")
    @PostMapping("/updateJob")
    public ResponseResult updateJobCron(@RequestBody @Validated XxlJobInfoRq rq) {
        return jobService.update(rq);
    }

    @ApiOperation("删除任务")
    @PostMapping("/removeJob/{id}")
    public ResponseResult removeJob(@PathVariable int id) {
        return jobService.removeJob(id);
    }

    @ApiOperation("启动任务")
    @PostMapping("/startJob/{id}")
    public ResponseResult startJob(@PathVariable int id) {
        return jobService.startJob(id);
    }

    @ApiOperation("暂停任务")
    @PostMapping("/pauseJob/{id}")
    public ResponseResult pauseJob(@PathVariable int id) {
        return jobService.pauseJob(id);
    }


    @ApiOperation("新增并启动任务")
    @PostMapping("/addAndStart")
    public ResponseResult addAndStart(@RequestBody @Validated XxlJobInfoRq rq) {
        return jobService.addAndStart(rq);
    }

    @ApiOperation("获取任务详情")
    @PostMapping("/{id}")
    public ResponseResult<XxlJobInfo> getJoInfo(@PathVariable int id) {
        return jobService.getJobInfo(id);
    }

    @ApiOperation("验证cron")
    @GetMapping("/checkCron")
    public ResponseResult checkCron(String cron) {
        return jobService.checkCronExpressionIsValid(cron);
    }

    @ApiOperation("获取cron的下一次执行时间")
    @GetMapping("/nextTriggerTime")
    public ResponseResult nextTriggerTime(String scheduleType, String scheduleConf) {
        return jobService.nextTriggerTime(scheduleType,scheduleConf);
    }

}

调用接口:
在这里插入图片描述
这里就会到对应模块的/start/{id}去调用对应服务。
在这里插入图片描述
业务模块:
在这里插入图片描述
到此,一次定时任务调度完毕。
至于怎样创建定时任务,我这里给个参考代码。

    @Override
    public ResponseResult createCallTask(OutboundDilapidatedReservoirs reservoirs) {
        //创建定时任务
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(reservoirs.getCallDate());
        int year = calendar.get(Calendar.YEAR);//获取年份
        int month = calendar.get(Calendar.MONTH) + 1;//获取月份
        int day = calendar.get(Calendar.DATE);//日
        int hours = calendar.get(Calendar.HOUR_OF_DAY);//小时
        int min = calendar.get(Calendar.MINUTE);//分钟
        int seconds = calendar.get(Calendar.SECOND);//秒
        String cron = seconds + " " + min + " " + hours + " " + day + " " + month + " ? " + year;
        ResponseResult result = xxlJobService.nextTriggerTime(XxlJobContants.scheduleType.CRON.getValue(),cron);
        if (R.FAIL == result.getCode()) {
            throw new BaseException(result.getMsg());
        }
        JSONArray array = JSON.parseArray(JSON.toJSONString(result.getData()));
        if (array.size()==0 ||!DateUtils.getNowDate().before(DateUtils.parseDate(array.get(0)))){
            throw new BaseException("任务时间已过期,请修改");
        }
        XxlJobInfoRq job = new XxlJobInfoRq();
        job.setJobDesc("定时任务,ID:" + reservoirs.getId());
        job.setAuthor(SecurityUtils.getUsername());
        job.setScheduleType(XxlJobContants.scheduleType.CRON.getValue());
        job.setScheduleConf(cron);
        job.setMisfireStrategy(XxlJobContants.misfireStrategy.DO_NOTHING.getValue());
        job.setExecutorRouteStrategy(XxlJobContants.executorRouteStrategy.FAILOVER.getValue());
        job.setExecutorHandler(OutboundConstants.TASK_TYPE_DILAPIDATED_RESERVOIRS);
        job.setExecutorBlockStrategy(XxlJobContants.executorBlockStrategy.SERIAL_EXECUTION.getValue());
        job.setExecutorTimeout(0);
        job.setExecutorParam(reservoirs.getId().toString());
        job.setExecutorFailRetryCount(0);
        job.setGlueType(XxlJobContants.glueType.BEAN.getValue());
        job.setExecutorParam(reservoirs.getId().toString());
        //新增并启动定时任务
        ResponseResult jobResult = xxlJobService.addAndStartApi(job);
        if (R.FAIL == jobResult.getCode()) {
            throw new BaseException("新增定时任务失败,请重试!");
        }
        Integer taskId = Integer.parseInt((String) jobResult.getData());
        if (taskId == null) {
            throw new BaseException("未获取到定时任务ID");
        }
        reservoirs.setStatus(OutboundConstants.CALL_TASK_STATUS_RUN);
        reservoirs.setTaskId(taskId);
        updateById(reservoirs);

        return ResponseResult.buildResponseResult(ResCodeEnum.SUCCESS);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能门锁-手机应用相机国产、非国产统计参数对比分析

智能门锁-手机应用相机国产、非国产统计参数对比分析 智能门锁应用 从2019年1月1日至2020年12月31日&#xff0c;3D人脸识别智能门锁在全市场统计中&#xff0c;总销量已接近20万套。其中德施曼以其先发优势&#xff0c;良好的市场定位和大力度的推广&#xff0c;成为市场发展…

C语言萌新如何使用printf函数?

&#x1f40e;作者的话 如果你搜索输入输出函数&#xff0c;那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的&#xff0c;作为一个萌新&#xff0c;哪懂这些&#xff1f; 本文介绍萌新在前期的学习中&#xff0c;常用的输入输出函数及其功能~ 跳跃…

【Python标准库】LZ77编码的基本原理和lzma模块

文章目录lz77编码lzma模块调用lz77编码 Python标准库总共提供了三种压缩算法&#xff0c;分别是zlib, bz2以及lzma&#xff0c;并且位这三个模块提供了高度相似的API&#xff0c;考虑到zlib中已经对很多定义做了详尽的解读&#xff0c;本文主要介绍一下lzma算法&#xff0c;然…

vue使用rem, vscode使用px to rem工具

一、使用px2rem-loader实现pxtorem 1、安装 首先&#xff0c;我们使用 vue 的脚手架 vue-cli 初始化一个 webpack 项目&#xff08;前提是已经安装过 vue-cli&#xff0c;具体不再阐述&#xff09;&#xff0c;一些选项根据自己项目需要选择。 vue init webpack my-app命令执…

深度学习算法数据-网络-算法总结

深度学习算法数据-网络-算法总结 1 数据集大全 通用2D检测数据集、交通标志、车道线、行人检测、3D目标检测、ReID等数据集 2 Backbone知识汇总 该部分主要是针对常见CNN结构以及ViT结构进行汇总&#xff0c;同时也包含轻量化CNN Backbone以及轻量化Transformer模型等高性…

详解pandas的read_excel函数

一、官网参数 pandas官网参数网址&#xff1a;pandas.read_excel — pandas 1.5.2 documentation 如下所示&#xff1a; 二、常用参数详解 1、io 一般指读取文件的路径。【必须指定】 import pandas as pddf pd.read_excel(r"C:\Users\wwb\Desktop\data3.xlsx")p…

chromecast激活

小白误入旁路由添加dns解析&#xff08;1&#xff09;外部网络设置不动&#xff0c;内部网络设置第一个dns服务器指向旁路由自己&#xff0c;第二个dns服务器用常用的保证能用就行&#xff08;2&#xff09;添加dns解析&#xff0c;把安卓ntp&#xff0c;更新时间的服务器链接成…

一文读懂CPU工作原理、程序是如何在单片机内执行的、指令格式之操作码地址码

文章较长,大家可选择性阅读,嘎嘎细 计算机结构 CPU的运行原理 CPU的控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。由运算器执行对应的机器指令,并将结果通过地…

如何用C++扩展NodeJS的能力?

文章目录前言C结合NodeJS的魅力C和NodeJS怎么结合通过Addon增强NodeJS环境的准备1. node-gyp2. nan (Native abstraction for NodeJS)编写Addon的C代码JS方法的C表示JS方法的传入参数 v8::Argument进阶进阶1: 输出一个JS包装类型进阶2: 使用多线程异步计算最后前言 Javascript…

Qt使用第三方库QXlsx将数据库的数据导出为Excel表格

一、参考和下载第三方库QXlsx 参考1 这篇博客对第三方库QXlsx介绍的比较详细。 1、概述 QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件&#xff0c;可以在Qt5支持的任何平台上使用。 2、使用方式 (1) QXlsx可以编译为静态库库使用&#xff08;可以提升项目编…

第03讲:使用kubeadm搭建k8s单master集群方案

一、安装前的准备工作 本实验使用1个master节点和2个node节点。 硬件配置&#xff08;必要&#xff09;&#xff1a;2GB 或更多 RAM&#xff0c;2 个 CPU 或更多 CPU&#xff0c;硬盘 30GB 或更多 开始本实验之前请先按照 使用kubeadm搭建k8s集群的准备工作 进行实验前的准备工…

从零开始带你实现一套自己的CI/CD(五)Jenkins+K8s

目录一、简介二、Jenkins K8s2.1 Jenkins配置k8s-master服务器信息2.2 配置镜像仓库信息2.3 编写k8s yaml文件2.4 将yaml文件推送到k8s2.5 配置免密钥登录2.6 k8s部署yaml资源文件2.7 重新部署yaml资源文件2.8 构建注意事项2.9 完整Jenkinsfile2.10 构建成功三、Webhook源码一…

合宙ESP32S3 CameraWebServe 测试demo

合宙ESP32S3 CameraWebServe 合宙ESP32S3 CameraWebServe测试&#xff0c;我们需要一个OV2640的摄像头模组用来采集图像传输给ESP32的&#xff0c;这里使用的OV2640是之前安信可十周年的白嫖的。现在直接插到合宙ESP32S3开发板&#xff0c;简直完美。还是白嫖好&#xff01;&a…

评估-----评估算法的指标

评估算法的优劣一般会用到以下参数&#xff1a; TN&#xff1a; 真反例 FN: 假反例 TP&#xff1a; 真正例 FP: 假正例 正样本负样本预测正样本TPFP预测负样本FNTN**精确率/查准率&#xff08;precision&#xff09;&#xff1a;**预测正确的正样本个数与预测为正样本的个数的…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(函数发生器)】

目录 序言 &#x1f34d;放置虚拟仪器仪表 &#x1f349;函数发生器 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0&#xff0c;打开如图所示的启动界面&am…

3-Spring创建

目录 1.创建一个普通的Maven项目 2.添加Spring框架支持(spring-context&#xff0c;spring-beans) 3.添加启动类 1.创建一个普通的Maven项目 不选择任何模板&#xff0c;直接点Next。 Name&#xff1a;项目名称&#xff1b; Location&#xff1a;项目保存路径&#xff1b; …

Lesson 3. 线性回归的手动实现(3.1 变量相关性基础理论 3.2 数据生成器与 Python 模块编写)

文章目录一、变量相关性基础理论二、数据生成器与 Python 模块编写1. 自定义数据生成器1.1 手动生成数据1.2 创建生成回归类数据的函数2. Python 模块的编写与调用在此前的内容当中&#xff0c;我们已经学习了关于线性回归模型的基本概念&#xff0c;并且介绍了一个多元线性回归…

看了以后大呼过瘾的程序员必备网站,速速收藏!

程序员必备的网站&#xff0c;网络上一搜一大把&#xff0c;动辄几十个甚至一百个&#xff0c;虽说大多数网站也都是实用的&#xff0c;但数量庞杂未免让人眼花缭乱。 这里我就只挑选精华&#xff0c;只挑选出程序员必备的8个网站&#xff0c;服务于程序员的工作&#xff06;生…

Python和MySQL对比(5):用Pandas实现MySQL窗口函数的效果

文章目录一、前言二、语法对比数据表row_number()lead()/lag()rank()/dense_rank()first_value()count()/sum()三、小结一、前言 环境&#xff1a; windows11 64位 Python3.9 MySQL8 pandas1.4.2 本文主要介绍 MySQL 中的窗口函数row_number()、lead()/lag()、rank()/dense_ran…

工业互联网蓬勃发展,出奇才能制胜

近年来&#xff0c;随着我国工业数字化转型的快速推进&#xff0c;我国工业发展进入产业新阶段&#xff0c;工业互联网迎来更加强劲的发展动能和更加广阔的发展空间&#xff0c;我国希望把握住新一轮的科技革命和产业革命&#xff0c;推进工业领域实体经济数字化、网络化、智能…