搭建一个简单的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.mzph.cn/pingmian/31598.shtml

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

相关文章

服务器权限管理

我们linux服务器上有严格的权限等级&#xff0c;如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户&#xff0c;服务等分配合理的权限十分重要。&#xff08;权限越大&#xff0c;责任越大&#xff09; 1.基本权限 U--user用户,G-group…

智谱API调用

一、智谱API 文心一言api 千帆大模型平台 申请和使用 智谱AI开放平台 登录智谱AI开放平台&#xff0c;点击右上角的开发者工作台&#xff0c;然后查看自己的API glm-4 接口 conda create -n zhipuai python3.10 -y 二、如何使用 这边的介绍是根据官方文档的接口文档来进行介绍…

深度学习之绘图基础

文章目录 1.实验目的2. 需求3.代码结果图片 1.实验目的 熟练绘制各种图像&#xff0c;为深度学习打基础 2. 需求 给定一个函数&#xff0c;需要你画出原图像以及这个函数在某点切线图像 3.代码 # File: python绘制函数图像以及倒数图像.py # Author: chen_song # Time: 20…

绽放光彩的小程序 UI 风格

绽放光彩的小程序 UI 风格

Zigbee开发笔记- IAR的使用

IAR Embedded Workbench(简称IAR EWB)是由瑞典IAR Systems公司开发的一个集成开发环境(IDE),专为微处理器开发而设计。以下是关于IAR Embedded Workbench的详细信息和特点: 支持的平台: IAR EWB支持多种芯片内核平台,包括ARM、AVR、MSP430等。它也支持多种处理器架构和…

vivado WIRE

WIRE是用于在Xilinx部件上路由连接或网络的设备对象。一根电线 是单个瓦片内部的一条互连金属。PIP、系紧装置和 SITE_PINs。 提示&#xff1a;WIRE对象不应与设计的Verilog文件中的WIRE实体混淆。那些 电线在设计中与网络有关&#xff0c;而不是与定义的设备的路由资源有关 WI…

创业众筹网

摘 要 创业是社会经济发展的重要动力&#xff0c;其在任何经济发展时期任何国家都最具活力与桃战性。然而创业的资金却是90%创业者面临的首要问题。包括积蓄不足、无不动产、负债、不知如何向银行申贷,及无法预估所创行业之总资金、成本。部分创业者虽然有心创业&#xff0c;但…

AI创作音乐引发的深思

在最近一个月中&#xff0c;音乐大模型的迅速崛起让素人生产音乐的门槛降到了最低。这一变革引发了关于AI能否彻底颠覆音乐行业的广泛讨论。在初期的兴奋过后&#xff0c;人们开始更加理性地审视AI在音乐领域的应用&#xff0c;从版权归属、原创性、创作质量、道德层面以及法律…

【读论文】Learning perturbations to explain time series predictions

文章目录 Abstract1. Introduction2. Background Work3. Method4. Experiments4.1 Hidden Markov model experiment4.2 MIMIC-III experiment 5. ConclusionReferences 论文地址&#xff1a;Learning Perturbations to Explain Time Series Predictions代码地址&#xff1a;htt…

深度学习Week17——优化器对比实验

文章目录 深度学习Week17——优化器对比实验 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 检查数据 2.3 配置数据集 2.4 数据可视化 四、构建模型 五、训练模型 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、模型评估 1、Accur…

鸿蒙 登录界面示例

1.b站登录界面 我的b站教学视频&#xff1a;https://www.bilibili.com/video/BV1LQgQexEGm/?spm_id_from333.999.0.0&vd_sourced0ea58f1127eed138a4ba5421c577eb1 最终实现效果&#xff1a; 需要准备2张图片&#xff0c;分别是向下和向右边的图标 代码&#xff1a; En…

第1章 MySQL数据库概述

1.1 基本概念 数据库是什么&#xff1f; 存储数据的地方 DB&#xff1a;数据库&#xff08;Database&#xff09; 为什么要用数据库&#xff1f; 因为应用程序产生的数据是在内存中的&#xff0c;如果程序退出或者是断电了&#xff0c;则数据就会消失。使用数据库是为了…

硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart Search”功能

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139869584 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

探索图神经网络(GNN):使用Python实现你的GNN模型

一、引言 图神经网络&#xff08;Graph Neural Network, GNN&#xff09;作为近年来机器学习和深度学习领域的热门话题&#xff0c;正逐渐吸引越来越多的研究者和开发者的关注。GNN能够处理图结构数据&#xff0c;在社交网络分析、推荐系统、化学分子结构预测等领域有着广泛的…

查看虚拟机命令(监控层面)

ps 命令 1、linux风格打印所有进程&#xff1a; ps -A ​ ps -e2、BSD风格打印所有的进程 ps au ​ ps aux 3、完整格式 ps -ef 4、常用组合 #查看CPU的详细信息 ​ cat /proc/cpuinfo ​ #查看内存的详细信息 ​ cat /proc/meminfo ​ #查看使用内存前10的进程 ​ ps -eo …

【LinuxC语言】线程的终止和栈清理

文章目录 前言一、线程的终止二、pthread_join函数三、线程栈的清理初步认识加强理解总结前言 在Linux环境下使用C语言进行多线程编程是一种常见的并发处理技术。线程相比于进程,具有更小的上下文切换开销,使得多线程程序能更高效地利用系统资源。然而,线程的终止和栈清理是…

学校校园考场电子钟,同步授时,助力考场公平公正-讯鹏科技

随着教育技术的不断发展&#xff0c;学校对于考场管理的需求也日益提高。传统的考场时钟往往存在时间误差、维护不便等问题&#xff0c;这在一定程度上影响了考试的公平性和公正性。为了解决这些问题&#xff0c;越来越多的学校开始引入考场电子钟&#xff0c;通过同步授时技术…

【ajax核心03】封装底层axios函数

目录 一&#xff1a;步骤总结 二&#xff1a;获取数据需求&#xff1a; 三&#xff1a;查找数据需求&#xff1a; 四&#xff1a;发送数据需求&#xff1a; 一&#xff1a;步骤总结 定义myAxios函数&#xff0c;接收配置对象&#xff0c;返回Promise对象发送XHR请求&#…

Redis启停脚本

目录 1.概述2.Redis自带脚本3.Redis安装4.修改Redis默认脚本5.注册为Service检验脚本/etc/init.d/redis-server脚本添加执行权限添加到redis-server服务启用redis-server服务 6.功能验证启动服务服务状态重启服务停止服务 1.概述 解决部分老系统&#xff0c;如Centos6上启停Re…

HTTP 状态码详解及使用场景

目录 1xx 信息性状态码2xx 成功状态码3xx 重定向状态码4xx 客户端错误状态码5xx 服务器错误状态码 HTTP思维导图连接&#xff1a;https://note.youdao.com/s/A7QHimm0 1xx 信息性状态码 100 Continue&#xff1a;表示客户端应继续发送请求的其余部分。 使用场景&#xff1a;客…