Quartz---基础

1.概述

       Quartz是一个完全由Java编写的开源任务调度框架,通过触发器来设置作业定时运行规则,控制作业的运行时间。Quartz框架的主要核心组件包括调度器、触发器和作业。调度器作为作业的总指挥,触发器作为作业的操作者,而作业则为应用的功能模块。Quartz集群通过故障切换和负载平衡的功能,为调度器提供了高可用性和伸缩性。

       Quartz主要用于执行定时任务,如定时发送信息、定时生成报表等。它提供了强大的任务调度机制,允许开发人员灵活地定义触发器的调度时间表,并可将触发器和任务进行关联映射。此外,Quartz还支持任务和调度的多种组合方式,以及调度数据的多种存储方式。

2. Quartz的核心元素

Quartz调度依靠的三大核心元素就是:Scheduler、Trigger、Job、JobDetail。

1. Job(任务)

作用:具体要执行的业务逻辑,比如:发送短信、发送邮件、访问数据库、同步数据等。

在 Quartz 中,JobDetail 通常与 Trigger 一起使用来定义作业的调度计划。Trigger 负责定义作业的执行时间、频率等动态信息,而 JobDetail 则提供了作业本身的描述。当调度器触发一个作业时,它会根据 JobDetail 中的信息来创建作业实例,并执行该实例的 execute 方法。

2.JobDetail

JobDetail 的主要作用包括:

  1. 提供作业信息:JobDetail 实例包含了作业的完整描述,包括作业类名、名称、组名等。这些信息对于调度器来说非常重要,因为它们帮助调度器识别和管理不同的作业。
  2. 存储作业数据:JobDetail 还包含了一个 JobDataMap 成员变量,用于存储特定作业实例的状态信息。JobDataMap 可以包含任何可以被序列化的对象,这使得你可以在调度作业时传递额外的数据给作业实例。
  3. 支持作业持久化:在 Quartz 中,JobDetail 实例可以被持久化到数据库中,以实现作业的持久化调度。这样,即使应用程序重新启动或崩溃,已经定义的作业仍然会被保留,并在适当的时候被调度执行。

3. Trigger(触发器)

作用:用来定义Job(任务)触发条件、触发时间,触发间隔,终止时间等。
四大类型:SimpleTrigger、CornTrigger、DateIntervalTrigger、NthIncludedDayTrigger。

  1. SimpleTrigger
    • SimpleTrigger用于在指定的开始时间和结束时间内,根据给定的重复计数和重复间隔来触发作业执行。
    • 它适用于需要在固定时间间隔内重复执行的任务,例如每隔10分钟执行一次。
    • SimpleTrigger的属性包括开始时间、结束时间、重复计数和重复间隔。
    • 如果指定了结束时间,并且重复计数达到了设定的值,触发器将停止触发作业。
    • SimpleTrigger的一个潜在问题是,如果作业错过了一次触发时间(例如由于系统停机),那么下次触发时间可能会受到影响,导致作业的执行时间变得不规律。
  2. CronTrigger
    • CronTrigger使用类似于Unix cron表达式的字符串来定义作业的执行时间表。
    • 它允许更复杂的调度规则,例如每月的第一个周一执行,或者在每个月的特定日期和时间的组合上执行。
    • Cron表达式提供了秒、分钟、小时、日期、月份和星期等字段,可以灵活地定义时间规则。
    • CronTrigger适用于需要按照固定日历模式执行的任务。
  3. DateIntervalTrigger
    • DateIntervalTrigger是在Quartz 1.7及更高版本中引入的,用于在固定的时间间隔内触发作业,例如每N小时、每N天或每N周。
    • 它特别适合调度需要定期重复但不需要考虑日历相关规则(如每月的第一个周一)的任务。
    • DateIntervalTrigger的属性包括开始时间、结束时间、时间间隔单位和时间间隔数量。
  4. NthIncludedDayTrigger
    • NthIncludedDayTrigger是Quartz中较新的触发器类型,用于在每个月的第N天执行作业。
    • 例如,如果你需要在每个月的第15天执行一个作业,你可以使用这个触发器来设置。
    • 这个触发器特别适用于那些需要在每个月的固定日期执行的任务。

4. scheduler(调度器)

作用:Scheduler启动Trigger去执行Job。
类型:Scheduler由scheduler工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。
第二种工厂StdSchedulerFactory使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。
Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。

3.Quartz的简单使用

1. 引入依赖:


项目中引入Quartz框架的依赖。如果您使用Maven构建项目,可以在pom.xml文件中添加以下依赖:


<dependency>  <groupId>org.quartz-scheduler</groupId>  <artifactId>quartz</artifactId>  <version>2.3.2</version> 
</dependency>

2. 定义作业(Job):


创建一个类实现org.quartz.Job接口,并实现execute方法。这个方法将在作业被调度时执行。

import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  public class MyJob implements Job {  public void execute(JobExecutionContext context) throws JobExecutionException {  // 这里是定时任务的逻辑部分  System.out.println("MyJob is executing.");  }  
}

3. 定义触发器(Trigger):


创建一个触发器来定义作业的执行计划。触发器可以指定作业的开始时间、结束时间、执行间隔等。

4.配置调度器(Scheduler):


创建一个调度器实例,并使用它来安排作业和触发器。

package schedule;import job.MyJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;public class MySchedule {public static void main(String[] args) {// 创建作业详情JobDetail jobDetail = JobBuilder.newJob(MyJob.class)//作业的类名.withIdentity("myJob", "group1")//作业的身份标识(名称和组名).build();//创建触发器Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//触发器的身份标识(名称和组名).withSchedule(SimpleScheduleBuilder.simpleSchedule()//设置触发器的调度计划.withIntervalInSeconds(3)//设置作业执行的间隔时间为3秒。.repeatForever())//指定触发器应该无限次地重复执行作业。.build();try {// 创建调度器实例Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();// 将作业和触发器注册到调度器scheduler.scheduleJob(jobDetail, trigger);// 开始调度器scheduler.start();} catch (SchedulerException se) {se.printStackTrace();}}
}

在上面的代码中,myJobDetail是一个JobDetail实例,它包含了作业的详细信息(如作业类名等)。您需要先创建JobDetail实例,并将其与作业类关联。

5.实现结果

6.关闭调度器


try {  scheduler.shutdown(true);  
} catch (SchedulerException se) {  se.printStackTrace();  
}

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

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

相关文章

前端常见的设计模式

说到设计模式&#xff0c;大家想到的就是六大原则&#xff0c;23种模式。这么多模式&#xff0c;并非都要记住&#xff0c;但作为前端开发&#xff0c;对于前端出现率高的设计模式还是有必要了解并掌握的&#xff0c;浅浅掌握9种模式后&#xff0c;整理了这份文章。 六大原则&…

【图像分割 2023 WACV】HiFormer

【图像分割 2023 WACV】HiFormer 论文题目&#xff1a;HiFormer: Hierarchical Multi-scale Representations Using Transformers for Medical Image Segmentation 中文题目&#xff1a;HiFormer:基于Transformer的分层多尺度表示医学图像分割 论文链接&#xff1a; 论文代码&a…

代码随想录算法训练营第三十四天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

860.柠檬水找零 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 细节&#xff1a; 1. 首先根据题意就是只有5.的成本&#xff0c;然后就开始找钱&#xff0c;找钱也是10.和5. 2. 直接根据10 和 5 进行变量定义&#xff0c;然后去循环…

Vue3+Vite+TS+Pinia+ElementPlus+Router+Axios创建项目

目录 初始项目组成1. 创建项目1.1 下载项目依赖1.2 项目自动启动1.3 src 别名设置vite.config.ts配置文件tsconfig.json配置若新创项目ts提示 1.4 运行测试 2. 清除默认样式2.1 样式清除代码下载2.2 src下创建公共样式文件夹style2.3 main.js中引入样式2.4 安装sass解析插件 2.…

数据分析(一) 理解数据

1. 描述性统计&#xff08;summary&#xff09; 对于一个新数据集&#xff0c;首先通过观察来熟悉它&#xff0c;可以打印数据相关信息来大致观察数据的常规特点&#xff0c;比如数据规模&#xff08;行数列数&#xff09;、数据类型、类别数量&#xff08;变量数目、取值范围…

剪辑视频衔接怎么操作 剪辑视频衔接过渡自然方法 剪辑视频教程新手入门 抖音剪辑短视频 会声会影视频制作教程

视频剪辑在现代社交媒体和数字媒体时代中变得越来越重要。它广泛应用于各种领域&#xff0c;包括电影制作、广告宣传、教育培训、社交媒体内容创作等。 一、剪辑视频衔接怎么操作 会声会影是一款功能强大、易于使用的视频编辑软件。接下来我们拿会声会影为例讲解剪辑视频如何…

这样讲话,可以减少95%的沟通问题

上一篇文章中&#xff0c;我们分享了沟通 3S 原则的第一点&#xff1a;简洁。 但是&#xff0c;仅仅有简洁&#xff0c;是不够的。简洁并不是我们沟通的目的&#xff0c;而只是方式。 沟通的目的是什么呢&#xff1f;是将信息高效地传达给对方&#xff0c;并在这过程中&#xf…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-静态内存

目录 一、内存管理二、静态内存2.1、静态内存运行机制2.2、静态内存开发流程2.3、静态内存接口2.4、实例2.5、代码分析&#xff08;待续...&#xff09;坚持就有收货 一、内存管理 内存管理模块管理系统的内存资源&#xff0c;它是操作系统的核心模块之一&#xff0c;主要包括…

【Web】NSSCTF Round#18 Basic个人wp(部分)

目录 ①门酱想玩什么呢&#xff1f; ②Becomeroot ①门酱想玩什么呢&#xff1f; 先试一下随便给个链接 不能访问远程链接&#xff0c;结合评论区功能&#xff0c;不难联想到xss&#xff0c;只要给个评论区链接让门酱访问就可 我们研究下评论区 从评论区知道&#xff0c;要…

jsp计算机线上教学系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 计算机线上教学系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

计算机网络——11EMail

EMail 电子邮件&#xff08;EMail&#xff09; 3个主要组成部分 用户代理邮件服务器简单邮件传输协议&#xff1a;SMTP 用户代理 又名“邮件阅读器”撰写、编辑和阅读邮件输入和输出邮件保存在服务器上 邮件服务器 邮箱中管理和维护发送给用户的邮件输出报文队列保持待发…

ChatGPT重大升级:能自动记住用户的习惯和喜好,用户有权决定是否共享数据给OpenAI

OpenAI刚刚宣布了ChatGPT的一项激动人心的更新&#xff01; OpenAI在ChatGPT中新加了记忆功能和用户控制选项&#xff0c;这意味着GPT能够在与用户的互动中记住之前的对话内容&#xff0c;并利用这些信息在后续的交谈中提供更加相关和定制化的回答。 这一功能目前正处于测试阶…

设计模式复习

单例模式 确保一个类最多只有一个实例&#xff0c;并提供一个全局访问点。 &#xff08;某个类的对象有且仅有一个&#xff0c;单例的对象充当的是全局变量的角色&#xff0c;为什么在C里面不直接使用全局变量&#xff0c;而是使用单例来代替全局变量&#xff0c;因为如果直接…

Linux+Win双系统远程重启到Win

背景 电脑安装了双系统&#xff08;ubuntu 22.04 win11&#xff09;&#xff0c;默认进入ubuntu系统。给电脑设置了WoL(Wake-on-LAN)&#xff0c;方便远程开机远程控制。 但是ubuntu的引导程序grub无法远程控制&#xff0c;远程开机会默认进入ubuntu。 虽然说可以进入ubuntu后…

【后端高频面试题--设计模式下篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--设计模式下篇 往期精彩内容设计模式总览模板方法模式怎么理解模板方法模式模板方…

基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)

订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 …

掌上新闻随心播控,HarmonyOS SDK助力新浪新闻打造精致易用的资讯服务新体验

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;将基于Speech Kit朗读控件上线…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(4.详解Hash数据结构)

Hash数据结构 看过前面的介绍,大家应该知道 Redis 的 Hash 结构的底层实现在 6 和 7 是不同的,Redis 6 是 ziplist 和 hashtable,Redis 7 是 listpack 和 hashtable。 我们先使用config get hash*看下 Redis 6 和 Redis 7 的 Hash 结构配置情况(在Redis客户端的命令行界面…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 默认缓存是一个带有MSHR&#xff08;未命中状态保持寄存器&#xff09;和WB&#xff08;写缓冲区&#xff09;的非阻塞缓存&#xff0c;用于读取和写入未命中。缓存还可以启用预取&#xff08;通常在最后一级缓存中&…

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段&#xff0c;不仅仅是智慧交通、智慧环保&#xff0c;如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢&#xff0c;正在通过信息化、数字化和智慧化的方式&#xff0c;实现全方位的精细化管理。本文以智慧公厕源头专…