Quartz 核心

一、Quartz 核心

工作原理:
  1. Scheduler 是一个计划调度器容器(总部),容器里面可以盛放众多的 JobDetailTrigger。当容器启动后,里面的每个 JobDetail 都会根据 Trigger 按部就班自动去执行。
  2. JobDetail 是一个可执行的工作,它本身可能是有状态的。
  3. Trigger 代表一个调度参数的配置,什么时候去调。
  4. JobDetailTriggerScheduler 容器上注册后,形成了装配好的作业(JobDetailTrigger 所组成的一对儿),就可以伴随容器启动而调度执行了。
  5. Scheduler 是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
概念详解:
  1. Job

    • 作业是一个执行任务的简单 Java 类。任务可以是任何 Java 代码。只需实现 org.quartz.Job 接口,并将需要执行的任务代码写在 execute() 方法中即可。当 Quartz 确定该是作业运行的时候,它将调用你的作业。Quartz 提供了一个机制来建立具有不同粒度的、可重复的调度表,于是,你只需创建一个 Java 类,这个类被调用而执行任务。
    public interface Job {void execute(JobExecutionContext context) throws JobExecutionException;
    }Class MyJob implements Job {@Override void execute(JobExecutionContext context) { // 任务执行代码}
    }
    
  2. JobDetail

    • JobDetail 对象由 Quartz 客户端在 Job 被加入到 Scheduler 时创建。它包含了 Job 的各种设置属性以及一个 JobDataMap 对象,这个对象被用来存储给定 Job 类实例的状态信息。Scheduler 并不保存真正的 Job Class,而是通过 JobDetail 来保存。
    • 注意,给 Scheduler 传入了一个 JobDetail 实例,而且这个 JobDetail 实例只是简单提供了类名来引用被执行的 Job。每次 Scheduler 执行这个任务时,它就创建这个类的新实例,然后调用该实例的 execute(..) 方法。Job 不必担心线程安全性,因为同一时刻仅有一个线程去执行给定 Job 类的实例,甚至是并发执行同一 Job 也是如此。
  3. JobFactory

    • JobFactory 控制 Job 的实例化
    Job newJob(TriggerFiredBundle bundle) throws SchedulerException;
    
    • 默认的 JobFactoryorg.quartz.simpl.SimpleJobFactory,缺省的 JobFactory 只是简单地对 Job 类调用 newInstance() 方法。
    • 设置 JobFactory
    scheduler.setJobFactory(factory);
    
    • 配置 quartz.propertiesorg.quartz.scheduler.jobFactory.class 属性设置 JobFactory 的类型
  4. JobDataMap

    • JobDataMap 被用来保存一系列的(序列化的)对象,这些对象在 Job 执行时可以得到。JobDataMap 是 Java Map 接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法。
    • 设置:
    JobDetail.getJobDataMap().put("jobSays", "Hello World!");
    
    • 获取:
      1. JobExecutionContext.getJobDetail().getJobDataMap();
      2. Trigger.getJobDataMap();
      3. JobExecutionContext.getMergedJobDataMap();
  5. StatefulJob

    • 有状态任务在执行任务过程中,任何对 JobDataMap 所作的更改都将丢失而且任务下次执行时也无法看到。
    • StatefulJob 在任务的每次执行之后重新存储 JobDataMap
  6. Trigger(触发器)

    • Trigger 对象被用来触发 jobs 的执行。你希望将任务纳入到进度,要实例化一个 Trigger 并且“调整”它的属性以满足你想要的进度安排。Triggers 也有一个 JobDataMap 与之关联,这非常有利于向触发器所触发的 Job 传递参数。Quartz 打包了很多不同类型的 Trigger, 最常用的 Trigger 类是 SimpleTriggerCronTrigger
      在这里插入图片描述
  7. SimpleTrigger

    • SimpleTrigger 用来触发只需执行一次或者在给定时间触发并且重复 N 次且每次执行延迟一定时间的任务。
    • 例如,如果你想让触发器在2010年1月11日,上午11:23:54秒执行,然后每隔10秒钟重复执行一次,并且这样重复5次,那么 SimpleTrigger 就可以满足你的要求。
  8. CronTrigger

    • 如果你需要像日历那样按日程来触发任务,而不是像 SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers 通常比 SimpleTrigger 更有用。
    • 使用 CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象 SimpleTrigger 一样,CronTrigger 也有一个 startTime 以指定日程从什么时候开始,也有一个(可选的)endTime 以指定何时日程不再继续。
    public CronTrigger(String name, String group, String jobName, String jobGroup, Date startTime, Date endTime, String cronExpression, TimeZone timeZone) throws ParseException;
    

    在这里插入图片描述

  9. Cron Expressions

    • Cron 表达式被用来配置 CronTrigger 实例。Cron 表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:
      • Seconds 秒
      • Minutes 分钟
      • Hours 小时
      • Day-of-Month 月中的天
      • Month 月
      • Day-of-Week 周中的天
      • Year (optional field) 年
  10. TriggerUtils

    • TriggerUtils 提供了许多便捷的方法简化了构造和配置 Trigger
    public static Trigger makeSecondlyTrigger(int intervalInSeconds);
    public static Trigger makeDailyTrigger(int hour, int minute);
    public static Trigger makeWeeklyTrigger(int dayOfWeek, int hour, int minute);
    public static Trigger makeMonthlyTrigger(int dayOfMonth, int hour, int minute);
    public static Date getNextGivenMinuteDate(Date date, int minuteBase);
    public static Date getEvenMinuteDate(Date date);
    

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

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

相关文章

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下,用几行代码就能创造出如此逼真的图像和动画,仿佛将艺术与科技完美融合,前端开发的Canvas技术正是这个数字化时代中最具魔力的一环,它不仅仅是网页的一部分,更是一个无限创意的画布,一个让你的想象…

软件源码购买一般在哪个网站?避坑指南

在数字化转型的浪潮中,软件源码的购买已成为许多企业和个人开发者快速搭建项目、节省开发成本的重要途径。选择合适的购买平台,不仅能确保源码的质量与合法性,还能享受到便捷的交易流程与专业的售后服务。本文小编将为您分享几个常见的软件源…

安卓 APK 安装过程详解

🍎个人博客:个人主页 🏆个人专栏:Android ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 1. 开机后连上网线 2. 查看网线的IP地址 3. 检查ADB连接 4. 修改文件权限 步骤 结语 我的其他博客 前言 在安卓设备上安装…

[PM]流程与结构设计

流程图 流程就是为了达到特定目标, 进行的一系列有逻辑性的操作步骤, 由两个及已上的步骤, 完成一个完整的行为过程, 即可称为流程, 流程图就是对这个过程的图形化展示 分类 业务流程图 概念: 描述业务流程的一种图, 通过特定符号和连线表示具体某个业务的处理步骤和过程作…

✈️一文带你入门【NestJS】

✈️引言 在现代Web开发领域,框架和技术的迭代速度令人咋舌。其中,NestJS作为一款基于Node.js的后端框架,以其卓越的设计理念和强大的功能集,迅速吸引了众多开发者的眼球。本文将带你深入了解NestJS的起源、发展,以及…

亚马逊自养号测评环境系统全解析:从注册到下单,一次成号无忧

亚马逊测评的关键在于养号,这是因为测评需要买家账号来操作。而养号不仅仅是让账号能多次使用,更重要的是通过维护让账号更健康、更有价值。很多人容易忽略的是,首次购买(首单)的成功率和它对账号的重要性。首单成功率…

Leetcode刷题——7 滑动窗口 双指针

注&#xff1a;以下代码均为c 1. 两数之和2&#xff08;输入有序数组&#xff09; // 法1&#xff1a;暴力 vector<int> twoSum1(vector<int>& numbers, int target) {vector<int> ans(2);int n numbers.size();for(int i 0; i < n-1; i){if(i ! 0…

递归(四)—— 初识暴力递归之“打印字符串的全排列”

题目1&#xff1a;序列打印一个字符串的全排列 题目分析&#xff1a;结合一实例来理解题目&#xff0c;str “abc”的全排列就是所求得的序列是 strp[0~2]的所有位的排列组合&#xff0c;strNew {“abc”, “acb”, “bac”, “bca”,”cba”,”cab”} 思路1&#xff1a;枚…

旷野之间3 – CTO 应具备的技能

​​​​​​ 随着技术渗透到商业的各个方面,首席技术官的角色变得越来越具有战略性和多面性。虽然深厚的技术技能仍然是基础,但今天的首席技术官还需要具备领导能力、商业敏锐度、沟通能力等优势。 根据我作为 CTO 的个人经验,我将深入探讨现代 CTO 所需的各种能力,包括:…

vue中,图片在div中按照图片原来大小等比例显示

图片在div中按照图片原来大小等比例显示&#xff0c;可以保证web上显示的图片和实际图片形状一样&#xff0c;保留原始图片效果 实现代码如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

百问网全志D1h开发板红外控制LVGL界面切换

红外控制LVGL界面切换 1. 测试红外功能 1.1 配置设备树 查看原理图&#xff1a; 可以看到红外对应的引脚号是PG16。 进入目录&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts&#xff1a; vim board.dts修改引…

MUNIK解读ISO26262:安全计划

前言 当我们进行功能安全开发时&#xff0c;由于整个项目周期和内容较多&#xff0c;因此需要在项目前期对一些问题提前进行规划&#xff1a;比如功能安全开发具体分为几个阶段&#xff0c;应该怎么去做&#xff1f;对于不同的环节&#xff0c;有哪些人员来执行&#xff1f;资…

在网上申请流量卡审核失败,可能是你的年龄有问题!

在网上申请流量卡审核失败&#xff0c;可能是你的年龄有问题&#xff01; 先上个图&#xff1a; ​ 网上的流量卡并不是随意申请的&#xff0c;而是填写申请信息后由运营商进行审核&#xff0c;审核通过后才会发卡&#xff0c;如果你提交的订单没有审核通过&#xff0c;那么大…

体积大的快递怎么寄便宜?如何寄件寄包裹更省钱?

大学毕业了&#xff0c;面对即将到来的工作生活&#xff0c;小李不得不把宿舍里的大包小包打包寄回家。可是&#xff0c;当他真正开始打包行李时&#xff0c;才发现这可不是一件简单的事&#xff1a;衣服、被子、书籍、杂物……这些东西加起来体积不小&#xff0c;想要省钱寄快…

HippoRAG如何从大脑获取线索以改进LLM检索

知识存储和检索正在成为大型语言模型(LLM)应用的重要组成部分。虽然检索增强生成(RAG)在该领域取得了巨大进步&#xff0c;但一些局限性仍然没有克服。 俄亥俄州立大学和斯坦福大学的研究团队推出了HippoRAG&#xff0c;这是一种创新性的检索框架&#xff0c;其设计理念源于人类…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0&#xff0c;然后 gym 版本是 0.22.0&#xff0c;python 版本是 3.8 &#xff0c;pygame 版本是 2.6.0 。 首先安装一下 gym&#xff1a; pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

Linux服务器CPU占用率达到100%排查思路

1、找到最耗CPU的进程pid&#xff0c;执行命令 top 2、找到最耗CPU的线程tid // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 14246 3、将线程pid转化为16进制 // printf "%x\n" [tid] 将tid…

Sharding-JDBC分库分表之SpringBoot主从配置

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 前言 在开发中&#xff0c;如果对数据库的读和写都在一个数据服务器中操作&#xff0c;面对日益增加的访问量&#x…

无法找到模块“@wangeditor/editor-for-vue”的声明文件

vue3项目中使用wangeditor/editor遇到的问题 开发环境不管红线报错正常使用 打包的时候就会报错了 1.安装依赖 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的问题 3.解决方法 在src目录下面创建 wangeditor-types.d.ts 文件 代码如下 de…