springboot集成分布式任务调度系统xxl-job(调度器和执行器)

news2024/11/25 18:46:38

一、部署xxl-job服务端

下载xxl-job源码

下载地址:
https://gitee.com/xuxueli0323/xxl-job

二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库

三、启动项目、访问首页

访问地址:
http://localhost:8080/xxl-job-admin/ 账号:admin 密码:123456

执行器管理

我们部署的是调度器管理平台,执行器就是我们实际开发的应用系统:比如:会员系统、订单系统、结算系统等等;执行器管理可以对每一个注册上来的执行器进行管理(编辑、删除执行器等)

任务管理

我们应用系统都会有自己特定的job任务:比如:会员系统定时拉取一些会员推送模板消息、短信消息;结算系统定时生成结算任务、报表等。任务管理可根据具体的执行器、job任务名称(JobHandler)、任务描述等进行筛选;可新增任务、启动任务、执行任务、查询调度日志,功能比较丰富。

用户管理

用户管理可根据角色(普通用户、管理员)进行管理:新增用户、删除用户

调度日志

在调度日志模块可查询我们执行任务时的具体情况,可根据具体的执行器、任务名称、执行状态进行筛选(成功、失败、进行中),对于进行中的任务可手动终止;调度备注列可查看调度详情,比如:我们的任务被调度到哪一台机器、调度的结果码、结果信息等等。

运行报表

运行报表是对调度平台中执行器数、任务数、调度次数、调度明细(成功、失败)数据的汇总统计。

四、新建结算系统执行器【仅仅是个demo案例】

看到此处,想必大家心中对xxl-job已经有了一些初步的了解和感受,摩拳擦掌,趁热打铁,下面我们新建一个结算系统应用,注册到调度平台,并新建一个月结任务,测试下吧。

引入xxl-job调度器依赖

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

application.properties配置文件新增xxl-job配置

#xxljob config
#调度器地址
xxl.job.admin.addresses = http://127.0.0.1:8080/xxl-job-admin
#鉴权用暂无
xxl.job.accessToken =
#执行器名称(就是我们的业务系统) 
xxl.job.executor.appname = settle-system
#执行器地址和ip,demo案例无需填写
xxl.job.executor.address =
xxl.job.executor.ip =
#执行器端口:默认值:9999
xxl.job.executor.port = 9999
#日志路径
xxl.job.executor.logpath = D:\\tmp\\log
#日志清理时间
xxl.job.executor.logretentiondays = 30

执行器配置类(XxlJobConfig.java):

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.beans.factory.annotation.Value;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
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;

    @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() {
        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;
    }

编写结算系统-月结job任务(
MonthlySettlementJobHandler.java)

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

@Component
public class MonthlySettlementJobHandler {

    private static Logger logger = LoggerFactory.getLogger(MonthlySettlementJobHandler.class);

		// 使用@XxlJob注解,将monthlySettlementJobHandler任务注册到调度平台
    @XxlJob("monthlySettlementJobHandler")
    public void monthlySettlementJobHandler(String param) throws InterruptedException {
        try {
            logger.info("结算系统-月结任务执行 参数: {}", param);
        } catch (Exception e) {
            logger.error("结算系统-月结任务执行 异常 参数: {} 异常信息: ", param, e);
        }
    }
}

结算系统执行器代码编写完毕,启动成功后,就需要去调度器管理平台新建我们的执行器、以及我们的job任务了。

在调度平台新建结算系统执行器

AppName:对应我们的配置:xxl.job.executor.appname = settle-system

名称:根据实际情况填写(结算系统)

注册方式:选择自动注册就可以了,结算系统在启动的时候,会自动向调度平台注册

机器地址:注册方式选择手动录入时才需要填写,此处我们无需填写

新建完毕之后,在列表页面具体的执行器了,点击OnLine 机器地址,可查看执行器的ip和端口

在调度平台新建结算系统调度任务

执行器:选择结算系统

任务描述:结算系统-月结任务

负责人:根据实际情况填写

报警邮件:根据实际情况填写

调度类型:选择CRON

Cron:填写Cron表达式:0 0 3 * * ? (每日凌晨3.00执行一次)

运行模式:Bean

JobHandler:就是我们编写的月结job任务代码中@XxlJob注解指定的名称:
monthlySettlementJobHandler

任务参数:根据实际情况填写,此demo案例没有使用参数

路由策略:策略较多,此处我们选择第一个

子任务ID:暂未

调度过期策略:忽略

阻塞处理策略:根据实际情况填写,此处我们选择单机串行

任务超时时间:单位:秒,根据实际情况填写,此处是3秒

失败重试次数:根据实际情况填写,此处我们选择不重试:0

执行结算系统-月结任务

点击:操作--》执行一次--》根据实际情况填写job参数--》机器地址无需填写

执行后,去结算系统查看日志,会有相应业务日志输出

再回到调度平台,点击:操作--》查询日志--》可看到调度时间、调度结果等等

四、总结

从调度平台部署、到业务应用系统(结算系统)对接调度平台、编写月结job任务,总体流程大家应该都比较清晰了,是不是觉得还挺简单的

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

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

相关文章

IO进程线程day9(2023.8.7)

一、Xmind整理&#xff1a; 消息队列的原理&#xff1a; 共享内存的原理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;用信号的方式回收僵尸进程&#xff08;重点&#xff01;&#xff09; 1.子进程退出后&#xff0c;父进程会收到17)SIGCHLD信号。 2.父进程中捕获…

04-1_Qt 5.9 C++开发指南_常用界面设计组件_字符串QString

本章主要介绍Qt中的常用界面设计组件&#xff0c;因为更多的是涉及如何使用&#xff0c;因此会强调使用&#xff0c;也就是更多针对实例&#xff0c;而对于一些细节问题&#xff0c;需要参考《Qt5.9 c开发指南》进行学习。 文章目录 1. 字符串与普通转换、进制转换1.1 可视化U…

用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码

一、i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度&#xff0c;如果是vue2点几&#xff0c;记得安装i18n的8版本&#xff0c;不然会自动安装的最新版本&#xff0c;后面会报错哦&#xff0c;查询了下资料&#xff0c;好像最新版本是适配的vue3。 npm install vue-…

2023年天猫除湿器行业数据分析(天猫数据分析软件)

除湿器是小家电的一种&#xff0c;随着人们生活品质的提升及健康意识的增强&#xff0c;人们对于除湿产品的观念也在不断改变&#xff0c;除湿器这一小家电也走入了越来越多消费者的家中。特别是在南方地区&#xff0c;全年的空气湿度都处于较高的水平&#xff0c;尤其是回南天…

PHP最简单自定义自己的框架创建目录结构(二)

1、mvc目录结构 2、目录解释 KJ&#xff1a;项目名称 core&#xff1a;框架核心目录 KJ.php 框架运行入口 index: 框架模块 controller:模块控制器 model:模块模型数据库操作 view:页面显示html index.php:index模块框架入口 3、index.php框架入口文件引入框架 <?php r…

FPGA学习——Altera IP核调用之PLL篇

文章目录 一、IP核1.1 IP核简介1.2 FPGA中IP核的分类1.3 IP核的缺陷 二、PLL简介2.1 什么是PLL2.2 PLL结构图2.3 C4开发板上PLL的位置 三、IP核调用步骤四、编写测试代码五、总结 一、IP核 1.1 IP核简介 IP核&#xff08;知识产权核&#xff09;&#xff0c;是在集成电路的可…

ReSharper C++ 2023 Crack

ReSharper C 2023 Crack ReSharper的AI助手会考虑项目中使用的语言和技术。这种上下文感知可以一开始就调整其响应&#xff0c;为您节省时间和精力。 您可以在查询中包含部分源代码。ReSharper将检测你发送或粘贴到聊天中的代码&#xff0c;并正确格式化&#xff0c;而人工智能…

Redis 加入服务列表自启动

1、下载reids windows版本&#xff0c;选择zip格式下载 2、解压zip&#xff0c;并进入路径&#xff1b; 3、命令提示符&#xff08;cmd&#xff09; 进入解压后的路径后&#xff0c;输入指令&#xff1a;redis-server --service-install redis.windows.conf&#xff1b; 4、如…

Gumbel-Softmax简介

一、Gumbel Softmax trick的使用场景 1. argmax简介 在NLP领域的强化学习或者对抗学习中&#xff0c;token的生成是离散的。比如&#xff0c;一个token的产生是一个大小为vocab size的one-hot向量。比如&#xff0c;对于character level的token&#xff1a; [ 1 , 0 , 0 , 0 …

阻抗是什么?什么时候要考虑阻抗匹配?

在电路设计中&#xff0c;我们常常碰到跟阻抗有关的问题&#xff0c;那么到底什么是阻抗&#xff1f; 在具有电阻、电感和电容的电路里&#xff0c;对电路中电流所起的阻碍作用叫做阻抗。常用Z来表示&#xff0c;它的值由交流电的频率、电阻R、电感L、电容C相互作用来决定。由…

Mybatis异常Invalid bound statement (not found)原因之Mapper文件配置不匹配

模拟登录操作 $.post("/admin/login", {aname, pwd }, rt > {if (rt.code 200) {location.href "manager/index.html";return;}alert(rt.msg)});网页提示服务器代码错误 POST http://localhost:8888/admin/login 500后端显示无法找到Mapper中对应的…

ros tf

欢迎访问我的博客首页。 tf 1. tf 命令行工具1.1 发布 tf1.2 查看 tf 2.参考 1. tf 命令行工具 1.1 发布 tf 我们根据 cartographer_ros 的 launch 文件 backpack_2d.launch 写一个 tf.launch&#xff0c;并使用命令 roslaunch cartographer_ros tf.launch 启动。该 launch 文件…

wpf 项目中使用 Prism + MaterialDesign

1.通过nuget安装MaterialDesign 2.通过nuget安装Prism 3.修改App.xmal <prism:PrismApplication x:Class"VisionMeasureGlue.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/…

简单易懂的Transformer学习笔记

1. 整体概述 2. Encoder 2.1 Embedding 2.2 位置编码 2.2.1 为什么需要位置编码 2.2.2 位置编码公式 2.2.3 为什么位置编码可行 2.3 注意力机制 2.3.1 基本注意力机制 2.3.2 在Trm中是如何操作的 2.3.3 多头注意力机制 2.4 残差网络 2.5 Batch Normal & Layer Narmal 2.…

C++入门篇5---模板

相信大家都遇到过这么一种情况&#xff0c;为了满足不同类型的需求&#xff0c;我们要写多个功能相同&#xff0c;参数类型不同的代码&#xff0c;为此&#xff0c;C引入了泛型编程这一概念&#xff0c;而模板就是实现泛型编程的基础&#xff0c;其实本质就是我们写一个类似”模…

JVM、JRE、JDK三者之间的关系

JVM、JRE和JDK是与Java开发和运行相关的三个重要概念。 再了解三者之前让我们先来了解下java源文件的执行顺序&#xff1a; 使用编辑器或IDE(集成开发环境)编写Java源文件.即demo.java程序必须编译为字节码文件&#xff0c;javac(Java编译器)编译源文件为demo.class文件.类文…

JavaScript + GO 通过 AES + RSA 进行数据加解密

浏览器端搞些小儿科的加密&#xff0c;就好比在黑暗夜空中&#xff0c;点缀了几颗星星&#xff0c;告诉黑客「这里有宝贵信息&#xff0c;快来翻牌」 浏览器端的加密&#xff0c;都是相对安全的。 它的具体安危&#xff0c;取决于里面存在的信息价值&#xff0c;是否值得破解者…

GO学习之 网络通信(Net/Http)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、 文章目录 GO系列前言一、H…

CAPL - XML和TestModule结合实现测试项可选(续)

二、xml文件编写 1、设置xml文件版本号 这个方便我们对xml文件进行文件管理,对于后续工作有进一步帮助。 <?xml version="1.0" ?> 2、设置xml根元素 在CANoe中使用的xml文件根元素我统一都会设置为testmodule,这也是我们在CANoe软件中选择测试用例的最大…

微服务间消息传递

微服务间消息传递 微服务是一种软件开发架构&#xff0c;它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展&#xff0c;并通过轻量级的通信机制进行交互。 应用开发 common模块中包含服务提供者和服务消费者共享的内容provider模块是…