搭建一个简单的xxljob

数据库表结构:

YyJobInfo:
public class YyJobInfo {//定时任务idprivate int id;//该定时任务所属的执行器的idprivate int jobGroup;//定时任务描述private String jobDesc;//定时任务添加的时间private Date addTime;//定时任务的更新时间private Date updateTime;//负责人private String author;//报警邮件private String alarmEmail;//调度类型private String scheduleType;//一般为调度的cron表达式private String scheduleConf;//定时任务的失败策略private String misfireStrategy;//定时任务的路由策略private String executorRouteStrategy;//JobHandler的名称private String executorHandler;//执行器参数private String executorParam;//定时任务阻塞策略private String executorBlockStrategy;//执行超时时间private int executorTimeout;//失败重试次数private int executorFailRetryCount;//定时任务运行类型private String glueType;//glue的源码private String glueSource;//glue备注private String glueRemark;//glue更新时间private Date glueUpdatetime;//子任务idprivate String childJobId;//定时任务触发状态,0为停止,1为运行private int triggerStatus;//最近一次的触发时间private long triggerLastTime;//下一次的触发时间private long triggerNextTime;
}

项目分层:

核心代码:

com.yy.yyjob.admin.core.thread.JobScheduleHelper

任务调度代码(有些逻辑采用模拟逻辑,后续会逐渐补全):
@Component
public class JobScheduleHelper {@Resourceprivate YyJobInfoDao yyJobInfoDao;// 调度定时任务的线程private Thread scheduleThread;// 创建当前类的对象private static JobScheduleHelper instance = new JobScheduleHelper();// 把当前类的对象暴露出去public static JobScheduleHelper getInstance(){return instance;}// 启动调度线程工作的方法public void start(){scheduleThread = new Thread(new Runnable() {@Overridepublic void run() {while (true){// 从数据库中查询所有定时任务信息List<YyJobInfo> yyJobInfoList =  YyJobAdminConfig.getAdminConfig().getYyJobInfoDao().findAll();// 得到当前时间long time = System.currentTimeMillis();// 遍历所有定时任务信息for (YyJobInfo yyJobInfo : yyJobInfoList) {if (time > yyJobInfo.getTriggerNextTime()){// 如果大于就执行定时任务,在这里就选用集合的第一个地址System.out.println("通知address服务器,去执行定时任务");// 计算定时任务下一次的执行时间Date nextTime = null;try {nextTime = new CronExpression(yyJobInfo.getScheduleConf()).getNextValidTimeAfter(new Date());} catch (ParseException e) {e.printStackTrace();}// 下面就是更新数据库中定时任务的操作YyJobInfo job = new YyJobInfo();job.setTriggerNextTime(nextTime.getTime());System.out.println("保存job信息");}}}}});scheduleThread.start();}
数据库配置代码:
/*** @Description:* 这个类可以说是服务端的启动入口,该类实现了Spring的InitializingBean接口,* 所以该类中的 afterPropertiesSet方法会在容器中的bean初始化完毕后被回掉。回掉的过程中会创建xxl-job中最重要的块慢线程池* 同时也会启动xxl-job中的时间轮*/
@Component
public class YyJobAdminConfig implements InitializingBean, DisposableBean {//当前类的引用,看到这里就应该想到单例模式了//xxl-job中所有组件都是用了单例模式,通过public的静态方法把对象暴露出去private static YyJobAdminConfig adminConfig = null;//获得当前类对象的静态方法public static YyJobAdminConfig getAdminConfig() {return adminConfig;}@Overridepublic void afterPropertiesSet() throws Exception {//为什么这里可以直接赋值呢?还是和spring的bean对象的初始化有关,XxlJobAdminConfig添加了@Component//注解,所以会作为bean被反射创建,创建的时候会调用无参构造器//而afterPropertiesSet方法是在容器所有的bean初始化完成式才会被回掉,所以这时候XxlJobAdminConfig对象已经//创建完成了,直接赋值this就行adminConfig = this;}@Overridepublic void destroy() throws Exception {}@Resourceprivate YyJobInfoDao yyJobInfoDao;@Resourceprivate DataSource dataSource;public YyJobInfoDao getYyJobInfoDao() {return yyJobInfoDao;}public DataSource getDataSource() {return dataSource;}

总结:

目前调度中心单独部署在一台服务器中,两个定时任务程序各自部署在不同的服务器上。调度中心和定时任务程序启动的时候,会先启动调度中心,然后再启动定时任务程序。这样,定时任务程序才能把定时任务的信息和定时任务部署的服务器的ip地址发送给调度中心,然后调度中心把这些信息记录在数据库中。然后,调度中心的调度任务的线程就会开始在一个while循环中不断地扫描数据库,查找数据库能够执行的定时任务,如果有定时任务到了执行时间了,就远程通知执行定时任务的程序执行定时任务,接着在计算定时任务下一次的执行时间,记录时间到数据库中。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百问网全志D1h开发板投屏功能实现

投屏功能实现 D1系列号称点屏神器&#xff0c;不仅能点屏&#xff0c;还能用于投屏。 源码准备 百问网为 【百问网D1h开发板】提供了投屏功能需要使用的源码&#xff0c;直接git下载即可&#xff1a; git clone https://github.com/DongshanPI/DongshannezhaSTU_DLNA_Scree…

Web应用安全测试-专项漏洞(一)

Web应用安全测试-专项漏洞&#xff08;一&#xff09; 专项漏洞部分注重测试方法论&#xff0c;每个专项仅列举一个例子。实际测试过程中&#xff0c;需视情况而定。 文章目录 Web应用安全测试-专项漏洞&#xff08;一&#xff09;Web组件&#xff08;SSL/WebDAV&#xff09;漏…

擎耀解码汽车大灯照明系统电动调节步进电机位置反馈的解决方案

在现代汽车设计中&#xff0c;智能照明系统扮演着至关重要的角色。其中&#xff0c;汽车大灯的电动调节功能不仅提高了夜间行车的安全性&#xff0c;还增强了车辆的科技感和便利性。然而&#xff0c;要实现精准的大灯角度调节&#xff0c;步进电机的位置反馈机制尤为关键。擎耀…

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展&#xff1a;人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点&#xff1a;数据的管理者&#xff08;DBMS&#xff09;&#xff1b;数据结构化&#xff1b;数据共享性高&#xff0c;冗余度低&#xff0c;易于扩充&#xff…

SpringBoot脚手架MySpringBootAPI(PgSQL+Druid+MyBatisPlus+Lombok)

MySpringBootAPI SpringBoot脚手架&#xff0c;基于SpringBootDruidPgSQLMyBatisPlusFastJSONLombok&#xff0c;其他的请自行添加和配置。 Author powered by Moshow郑锴(大狼狗) , https://zhengkai.blog.csdn.net 如何运行 1.首先确保你是JDK17&#xff0c;推荐微软的MSJDK…

Links: Challenging Puzzle Game Template(益智游戏模板)

链接:挑战益智游戏 《Links》是一款独特且具有挑战性的益智游戏,即将发布。 每个级别都会向玩家展示不同的棋盘。目标是通过移动和旋转所有棋子来连接它们。每个棋子都有自己的特点和功能-你可以移动它们,旋转它们,或者两者兼而有之。连接所有棋子,以解决难度和挑战不断增…

【系统架构设计师】七、信息安全技术基础知识(访问控制技术|抗攻击技术|计算机系统安全保护能力等级)

目录 一、访问控制技术 二、信息安全的抗攻击技术 2.1 分布式拒绝服务DDoS与防御 2.3 ARP欺骗攻击与防御 2.4 DNS欺骗与防御 2.5 IP欺骗与防御 2.6 端口扫描&#xff08;Port Scanning&#xff09; 2.7 强化TCP/IP堆栈以抵御拒绝服务攻击 2.8 系统漏洞扫描 三、信息安…

实现矩阵乘法【矩阵乘法复杂度优化】

实现矩阵乘法【矩阵乘法复杂度优化】 题目描述&#xff1a;解题思路一&#xff1a;使用NumPy库解题思路二&#xff1a;三个for循环解题思路三&#xff1a;分块矩阵乘法, 利用多线程或多进程 题目描述&#xff1a; 实现矩阵乘法【矩阵乘法复杂度优化】 解题思路一&#xff1a;…

面试突击:Java 集合知识体系梳理

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。在 Java 开发中&#xff0c;集合类对象绝对是被使用最频繁的对象之一。因此&#xff0c;深入了解集合类对象的底层数…

World of Warcraft T2.5

World of Warcraft T2.5 猎人和术士套装需要的材料&#xff0c;好多啊&#xff0c;废墟和神殿打材料 猎人&#xff1a; 术士&#xff1a;

k8s学习--k8s群集部署zookeeper应用及详细解释

文章目录 zookeeper什么是zookeeper基本概念主要功能工作原理使用场景优点缺点 k8s集群部署zookeeper环境一、zookeeper部署YAML资源清单准备二、zookeeper部署及部署验证三、zookeeper应用验证 zookeeper 什么是zookeeper ZooKeeper 是一个开源的分布式协调服务&#xff0c;…

多线程(基础)

前言&#x1f440;~ 上一章我们介绍了什么是进程&#xff0c;对于进程就了解那么多即可&#xff0c;我们作为java程序员更关注线程&#xff0c;线程内容比较多&#xff0c;所以我们要分好几部分才能讲完 目录 进程的缺点 多线程&#xff08;重要&#xff09; 进程和线程的区…

数据结构速成--树和二叉树

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 气死了…

昇思25天学习打卡营第4天|数据集Dataset

数据集 Dataset 介绍 之前说过&#xff0c;MindSpore是基于Pipeline&#xff0c;通过Dataset和Transformer进行数据处理。Dataset在其中是用来加载原始数据的。mindSpore提供了数据集加载接口&#xff0c;可以加载文本、图像、音频等&#xff0c;同时也可以自定义加载接口。此…

乾坤微服务的使用

前言&#xff1a; 在这里整理下用乾坤来开发微服务的一些资料。 使用好处&#xff1a; 使用乾坤可以实现什么效果呢&#xff1f;众所周知&#xff0c;前端的框架五花八门&#xff0c;react/vue/angular等各领风骚&#xff0c;那么如果我们有需要把不同技术栈的项目整合起来&…

Vue3学习笔记<->创建第一个vue项目

新建一个项目目录 找一个盘新建一个目录&#xff0c;我这里在D盘创建一个vuedemo目录作为项目存放的目录。使用idea打开目录。   单击ieda底部的按钮“Terminal”&#xff0c;打开命令行窗口&#xff0c;如果命令行窗口当前目录不是“vuedemo”&#xff0c;就切换到“vuedem…

文本分类-RNN-LSTM

1.前言 本节介绍RNN和LSTM&#xff0c;并采用它们在电影评论数据集上实现文本分类&#xff0c;会涉及以下几个知识点。 1. 词表构建&#xff1a;包括数据清洗&#xff0c;词频统计&#xff0c;词频截断&#xff0c;词表构建。 2. 预训练词向量应用&#xff1a;下载并加载Glove的…

Vue2 - 首页登录实现随机验证码组件的封装与实现详解(详细的注释及常见问题汇总)

在网站首页等登录时,随机验证码在现代网络应用中扮演着重要的安全角色。为了帮助开发者轻松集成和使用随机验证码功能,本文将介绍如何利用 Vue.js 2 封装一个简单而功能强大的随机验证码组件。让你能够快速理解并应用这一组件到你的项目中。 一、解决方案 本文提供了完美便捷…

上海计算机考研避雷,25考研慎报

上大计算机一直很热 408考研er重来没有让我失望过&#xff0c;现在上大的专业课是11408&#xff0c;按理说&#xff0c;这个专业课的难度是很高的&#xff0c;但是408er给卷出了新高度&#xff0c;大家可以去上大官网看看今年最新的数据&#xff0c;我也帮大家统计了24年最新的…

Redis集群(Clustering in Redis)工作机制详解

Redis集群工作机制详解 Redis 集群是用于提高 Redis 可扩展性和高可用性的解决方案。 维基百科&#xff1a;Scalability is the property of a system to handle a growing amount of work by adding resources to the system. 可扩展性是系统的一种允许通过增加系统资源来处…