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();  
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有关光猫、路由器、交换机、网关的理解

前提 在了解计算机网络的过程中&#xff0c;出现了这四个名词&#xff1a;光猫、路由器、交换机、网络。有点模糊&#xff0c;查阅互联网相关资料&#xff0c;进行整理。如有错误&#xff0c;欢迎大家批评指正。 光猫 首先光猫是物理存在的&#xff0c;大家在家里应该都可以…

代码随想录day25--回溯的应用4

LeetCode491.非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;…

AI生图软件:让创意无限飞扬

随着科技的飞速发展&#xff0c;人工智能(AI)已经逐渐渗透到我们的日常生活之中&#xff0c;其中包括图像编辑。AI生图软件就是这样一种应用了AI技术的创新产品&#xff0c;它正在改变着图像编辑的方式&#xff0c;让我们能够以前所未有的方式创作和分享视觉内容。 一、什么是A…

300分钟吃透分布式缓存-01讲:业务数据访问性能太低怎么办?

这节课主要讲缓存的基本思想、缓存的优点、缓存的代价三个部分。 缓存的定义 先来看下缓存的定义。 & 缓存最初的含义&#xff0c;是指用于加速 CPU 数据交换的 RAM&#xff0c;即随机存取存储器&#xff0c;通常这种存储器使用更昂贵但快速的静态 RAM&#xff08;SRAM&…

七、Mybatis缓存

缓存就是内存中的数据&#xff0c;常常来自对数据库查询结果的保存&#xff0c;使用缓存、可以避免频繁的与数据库进行交互&#xff0c;进而提高响应速度一级缓存是sqlSession级别的缓存&#xff0c;在操作数据库时需要构造sqlsession对象&#xff0c;在对象中有一个数据结构&a…

前端技巧之svg精灵图svg-sprite-loader

首先说明精灵图的必要性&#xff0c;其可以让我们只需要向服务器请求一次图片资源&#xff0c;就能加载很多图片&#xff0c;即能够减轻http请求造成的服务器压力。 然后这里要说明的是这个插件是webpack上面的&#xff0c;所以在vue2中比较好用&#xff0c;如果在vue3中&…

C语言—字符数组(3)

可能不是那么的完整&#xff0c;先凑合看吧&#xff0c;如果我学会如何修改以后&#xff0c;我慢慢回来修改的 1.编写程序实现对两个字符串的连接功能&#xff1b; 法一:不使用strcat函数,写程序直接实现&#xff0c;记得添加结束符&#xff0c;不然程序访问数组时候将变得不…

Vue路由

Vue路由 一、路由的基本使用二、组件的存放目录问题三、路由的封装抽离四、声明式导航-导航链接五、声明式导航-查询参数传参六、Vue路由-重定向七、编程式导航-两种路由跳转方式八、编程式导航-两种路径跳转传参九、多级路由十、缓存组件 一、路由的基本使用 1.目标 认识插件…

算法学习系列(三十五):贪心(杂)

目录 引言一、合并果子&#xff08;Huffman树&#xff09;二、排队打水&#xff08;排序不等式&#xff09;三、货仓选址&#xff08;绝对值不等式&#xff09;四、耍杂技的牛&#xff08;推公式&#xff09; 引言 上一篇文章也说过了这个贪心问题没有一个规范的套路和模板&am…

《白话C++》第10章 STL和boost,Page73~74 boost::scoped_array

当所要创建的具体类型必须在运行时才能确定&#xff0c;此时需要使用new来实现动态创建&#xff1b; 另外还有一种&#xff1a;当需要一次性创建多个对象&#xff0c;但到底是几个无法在写代码时知道&#xff0c;需要在运行时动态创建&#xff0c;这种情况下也需要动态创建。此…

大数据,对于生活的改变

谷歌通过对于疾病的查询量可以预测一个个h1n1病毒的大爆发&#xff0c; 大数据时代对于人的考验 用户的搜索记录就是一种信息&#xff0c;这种信息会满足其基础相关的词条与其有关的词条&#xff08;最为原始的搜索机制&#xff0c;国内的搜索引擎都是采用这种基础原理。&…

柚见(伙伴匹配系统)第五期

后端个人信息接口 前端修改用户信息&#xff0c;点击提交&#xff1b;现在无法对接到后端&#xff0c;需要在后端新写一个接口/user/update。 控制层新增用户信息更新接口。 HttpServetRequest request: 前端的请求头中获取cookie,在后端查询登录态进行鉴权 User getLoginU…

化繁为简!用pytest编写接口自动化测试脚本的简易思路

引言 当今互联网时代&#xff0c;软件质量成为越来越重要的一个问题&#xff0c;而接口自动化测试是保障软件质量的一种关键手段。 在这个过程中&#xff0c;pytest成为了许多开发者的首选工具&#xff0c;既易于使用&#xff0c;又具有强大的功能。但是&#xff0c;对于初学…

C/C++ BM8 链表中倒数最后k个结点

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题和BM1中的思路有些许类似&#xff0c;整体不难。 题目 描述 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 ai &#xff0c;返回该链表中倒数第k个节点。 如果…

three.js 物体下落动画(重力加速度)

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><el-button click"loopFun"> 物体下落…

效果图渲染为什么找「瑞云渲染」瑞云渲染邀请码WFQB

效果图的渲染可以通过个人的电脑&#xff0c;也可以通过第三方的云渲染平台&#xff0c;两者之间的区别很多人都知道是什么。如果用户需要使用个人电脑&#xff0c;通常需要搭配高性能的硬件&#xff0c;然而硬件中最贵的当数CPU、GPU&#xff0c;云渲染平台则是通过租用高配置…

day6:继承与多态

思维导图 2.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff…

Win32汇编数组学习2

之前学习过win32汇编数组&#xff1b;还不熟悉&#xff1b;继续熟悉&#xff1b; 先做几个基本的对话框&#xff0c;有一个静态文本框&#xff1b; 定义数组之后&#xff0c;用 wsprintf 函数格式化&#xff0c;然后调用 SetDlgItemText 赋值给静态文本框&#xff1b; arr1 …

[C++]二叉搜索树

一、定义 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

深入浅出熟悉OpenAI最新大作Sora文生视频大模型

蠢蠢欲动&#xff0c;惴惴不安&#xff0c;朋友们我又来了&#xff0c;这个春节真的过的是像过山车&#xff0c;Gemini1.5 PRO还没过劲&#xff0c;OpenAI又放大招&#xff0c;人类真的要认输了吗&#xff0c;让我忍不住想要再探究竟&#xff0c;到底是什么让文生视频发生了质的…