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.hqwc.cn/news/475896.html

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

相关文章

大模型- 检索增强七宗罪

前言 地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 标题&#xff1a;Seven Failure Points When Engineering a Retrieval Augmented Generation System 这篇论文介绍了如何设计一个检索增强生成系统&#xff08;RAG&#xff09;&#xff0c;作者通过对三个不同领域…

【Android 性能优化:内存篇】——优化 GPU 内存的神秘方法

背景 笔者最近承接项目的内存优化工作&#xff0c;在预研的过程中发现一篇关于内存优化的文章 《优化安卓应用内存的神秘方法以及背后的原理&#xff0c;一般人我不告诉他》 里面介绍了一个方法 WindowManagerGlobal.getInstance().startTrimMemory(TRIM_MEMORY_COMPLETE);…

x86使用内敛汇编实现简单的临界段保护

临界资源保护 实现方法 禁用中断 __attribute__((used)) static inline uint32_t read_eflags (void){uint32_t eflags;ASM_V("pushf\n\tpop %%eax":"a"(eflags));return eflags; } __attribute__((used)) static inline void write_eflags (uint32_t e…

VMware虚拟机安装CentOS7

对于系统开发来说&#xff0c;开发者时常会需要涉及到不同的操作系统&#xff0c;比如Windows系统、Mac系统、Linux系统、Chrome OS系统、UNIX操作系统等。由于在同一台计算机上安装多个系统会占据我们大量的存储空间&#xff0c;所以虚拟机概念应运而生。本篇将介绍如何下载安…

代码随想录算法训练营|二叉树总结

二叉树的定义&#xff1a; struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* left,TreeNode* right):val(val),left(left),…

沁恒CH32V30X学习笔记00--芯片概述

芯片概述 资源 系统框图 V303时钟树 V305/V307时钟 RISC-V4F 处理器 单精度浮点运算 处理器内部以模块化管理, 包含快速可编程中断控制器(PFIC) 内存保护 分支预测模式 扩展指令支持等单元 小端数据模式 多级硬件中断堆栈&#

Vite 构建流程大揭秘:快速构建前端项目的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

03 SS之返回JSON+UserDetail接口+基于数据库实现RBAC

1. 返回JSON 为什么要返回JSON 前后端分离成为企业应用开发中的主流&#xff0c;前后端分离通过json进行交互&#xff0c;登录成功和失败后不用页面跳转&#xff0c;而是给前端返回一段JSON提示, 前端根据JSON提示构建页面. 需求: 对于登录的各种状态 , 给前端返回JSON数据 …

php 函数(方法)、日期函数、static关键字

php 函数、日期函数 1. php函数2. 日期函数3. static 1. php函数 函数是一段可重复使用的代码块&#xff0c;可以将一系列操作封装起来&#xff0c;使代码更加模块化、可维护和可重用&#xff0c;来大大节省我们的开发时间和代码量&#xff0c;提高编程效率。 <?php// …

【机构vip教程】Charles(1):Charles的介绍及安装

Charles Charles 是在 Mac &#xff08;Charles是跨平台的 &#xff09;下常用的网络封包截取工具&#xff0c;在做移动开发、测试时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。Charles是一个HTTP代理服务器,HTTP监视器,反转代…

【机构内部教程】Jmeter性能测试【一】:性能测试全套教程

性能测试的概念 性能测试是指通过特定方式&#xff0c;对被测系统按照一定策略施加压力&#xff0c;获取系统 响应时间、TPS&#xff08;Transaction Per Second&#xff09;、吞吐量、资源利用率等性能指标&#xff0c;以期保证生产系统的性能能够满足用户需求的过程。 性能…

阿里云香港轻量应用服务器是什么线路?cn2?

阿里云香港轻量应用服务器是什么线路&#xff1f;不是cn2。 阿里云香港轻量服务器是cn2吗&#xff1f;香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器&#xff0c;通过mtr traceroute测试了一下&#xff0c;最后一跳是202.97开头的ip&#xff0c;1…