Quartz简介

article/2025/8/22 13:39:00

文章目录

    • Quartz 是什么
    • What is the Quartz Job Scheduling Library?
      • 使用场景
      • 特点
      • Quartz 使用的设计模式
    • Java 语言实现定时任务的几种方式
    • 核心元素
      • Scheduler
      • Trigger
      • Calendar
      • JobDetail
      • Job
      • JobExecutionContext
    • 核心元素之间的关系
    • Quartz 类图
    • 主要线程
    • 数据存储


最近做了一个活动管理的项目,项目中有活动开始通知和活动结束通知等功能,需要创建大量的定时任务,最后选择使用 Quartz 分布式调度框架。本文主要是对 Quartz 进行简单介绍,了解 Quartz 是什么,有哪些核心元素,使用场景和特点等。

Quartz 是什么

What is the Quartz Job Scheduling Library?

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.

Quartz is freely usable, licensed under the Apache 2.0 license.

Quartz Job Scheduling Library是什么? Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统。 Quartz可用于创建简单或复杂的计划,以执行数以十计,百计,万计的工作。任务标准Java组件的任务,都可以执行您对其执行的任何编程操作。Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持。

Quartz是免费使用的,并根据Apache 2.0许可获得许可。

Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。官网地址:http://www.quartz-scheduler.org/

使用场景

  • 持久性任务 - 就是保持调度定时的状态;
  • 任务管理 - 对调度任务进行有效的管理;

当遇到以下问题时:

  • 自动关闭30分钟未支付的订单
  • 与第三方公司对账业务
  • 数据统计,比如博客系统统计日粉丝数,日阅读量等
  • 活动开始和结束通知;
  • 想在每月25号,自动还款;
  • 每周或者每月的提醒事项,比如周总结或者月总结;

像这种某个时间点执行任务,或者每隔一段时间重复执行任务,都可以用Quartz实现

特点

  • 强大的调度功能,例如丰富多样的调度方法,可以满足各种常规和特殊需求;
  • 灵活的应用方式,例如支持任务调度和任务的多种组合,支持调度数据的多种存储方式(DB,RAM等);
  • 支持分布式集群,在被Terracotta收购之后,在原来基础上进行了进一步的改造。

Quartz 使用的设计模式

  • Builder模式
  • 组件模式
  • Factory模式

Java 语言实现定时任务的几种方式

  • java.util.Timer:一个 JDK 中自带的处理简单定时任务的工具。
  • java.util.concurrent.ScheduledExecutorService:JDK 中的定时任务接口,可以将定时任务与线程池功能结合使用。
  • org.springframework.scheduling.annotation.Scheduled:Spring 框架中基于注解来实现定时任务处理。
  • Quartz:一个完全由 Java 语言编写的,支持分布式调度任务的开源框架。

核心元素

Quartz任务调度的核心元素主要有:Scheduler任务调度器、Trigger触发器、Job任务、JobDetail调度程序。其中trigger和job、jobDetail为任务调度的元数据,而Scheduler为实际执行调度的控制器。

Scheduler

任务调度器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。正常情况下一个应用只需要一个Scheduler对象。

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

Trigger

触发器,调度任务的时间规则。Quartz中主要提供了四种类型的Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。这四种trigger可以满足企业应用中的绝大部分需求。

Calendar

一些日历特定时间点的集合。一个trigger可以包含多个Calendar,以便排除或包含某些时间点。

JobDetail

JobDetail是一个具体的可执行的调度程序,Job是这个可执行调度程序所要执行的内容,另外JobDetail还包含了任务调度的方案和策略。

JobDetail绑定指定的Job,每次Scheduler调度执行一个Job的时候,首先会拿到对应的Job,然后创建该Job实例,再去执行Job中的execute()的内容,任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。

为什么设计成JobDetail + Job,不直接使用Job

JobDetail定义的是任务数据,而真正的执行逻辑是在Job中。
这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而 JobDetail 绑定 Job 方式,Sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。

Job

任务,表示要执行的具体工作或者被调度的任务。我们的任务类实现该接口,重写execute方法来定义任务的执行逻辑。主要有两种类型的job:无状态的(stateless)和有状态的(stateful)。对于同一个trigger来说,有状态的job不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。Job主要有两种属性:volatility和durability,其中volatility表示任务是否被持久化到数据库存储,而durability表示在没有trigger关联的时候任务是否被保留。两者都是在值为true的时候任务被持久化或保留。一个job可以被多个trigger关联,但是一个trigger只能关联一个job。

JobExecutionContext

JobExecutionContext中包含了Quartz运行时的环境以及Job本身的详细数据信息。

当Schedule调度执行一个Job的时候,就会将JobExecutionContext传递给该Job的execute()中,Job就可以通过JobExecutionContext对象获取信息。

核心元素之间的关系

Quartz 类图

主要线程

在Quartz中,有两类线程,也即执行线程和调度线程,其中执行任务的线程通常用一个线程池维护。线程间关系如下图
img
在quartz中,Scheduler调度线程主要有两个:regular Scheduler Thread(执行常规调度)和Misfire Scheduler Thread(执行错失的任务)。其中Regular Thread 轮询Trigger,如果有将要触发的Trigger,则从任务线程池中获取一个空闲线程,然后执行与Trigger关联的job;Misfire Thraed则是扫描所有的trigger,查看是否有错失的,如果有的话,根据一定的策略进行处理。

数据存储

Quartz中的trigger和job需要存储下来才能被使用。Quartz中有两种存储方式:RAMJobStore,JobStoreSupport,其中RAMJobStore是将trigger和job存储在内存中,而JobStoreSupport是基于jdbc将trigger和job存储到数据库中。RAMJobStore的存取速度非常快,但是由于其在系统被停止后所有的数据都会丢失,所以在集群应用中,必须使用JobStoreSupport。

注意:quartz集群是通过数据库表来感知其他的应用的,各个节点之间并没有直接的通信。只有使用持久的JobStore才能完成Quartz集群。

quartz的sql所在位置

1、/docs/dbTables

2、org/quartz/impl/jdbcjobstore

其中表结构

Serial NumberTable NameDescription
1QRTZ_CALENDARS存储Quartz日历信息
2QRTZ_CRON_TRIGGERS存放Cron类型的Trigger,包括Cron表达式和时区信息
3QRTZ_FIRED_TRIGGERS存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息
4QRTZ_PAUSED_TRIGGER_GRPS存储已暂停的Trigger组的信息
5QRTZ_SCHEDULER_STATE存储少量的Scheduler相关的状态信息
6QRTZ_LOCKS存储程序的悲观锁的信息(如果使用了悲观锁)
7QRTZ_JOB_DETAILS存储每一个已配置的JobDetail信息
8QRTZ_SIMPLE_TRIGGERS存储Simple类型的Trigger,包括重复次数、间隔、以及已触的次数
9QRTZ_BLOG_TRIGGERS以Blob类型存储的Trigger
10QRTZ_TRIGGERS存储已配置的Trigger的基本信息
11QRTZ_TRIGGER_LISTENERSTrigger监听器
12QRTZ_JOB_LISTENERSJob监听器

注意:cron方式需要用到的4张数据表: QRTZ_TRIGGERS,QRTZ_CRON_TRIGGERS,QRTZ_FIRED_TRIGGERS,QRTZ_JOB_DETAILS。


http://chatgpt.dhexx.cn/article/NGZ7YS3F.shtml

相关文章

【quartz表结构及说明】

文章目录 一、quartz表信息二、表字段说明 1.qrtz_blob_triggers2.qrtz_calendars3.qrtz_cron_triggers4.qrtz_fired_triggers5.qrtz_job_details6. qrtz_locks7.qrtz_paused_trigger_grps8. qrtz_scheduler_state9.qrtz_simple_triggers10.qrtz_triggers 一、quartz表信息 qr…

Quartz数据库表分析

2019独角兽企业重金招聘Python工程师标准>>> 系列文章 Spring整合Quartz分布式调度 Quartz数据库表分析 Quartz调度源码分析 前言 上一篇文章Spring整合Quartz分布式调度介绍了Quartz通过数据库的方式来实现分布式调度,通过使用数据库来存储trigger&…

php rsa公钥加密,PHP RSA加密

这两天正好做一个rsa加密,现在就总结一下其中的几个要点。 1.什么是rsa算法 RSA公钥加密算法是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA…

php 代码加密运行,php加密后可以直接运行吗

加密后的php代码需要ZendGuardLoader模块才能正常运行 下载ZendGuardLoader压缩包 下载好后解压压缩包,找到目录下的 ZendLoader.dll 文件,将它放到你的php目录下ext下,再编辑php.ini文件,添加一段代码:[Zend.loader] …

PHP加密 php源代码在线加密工具推荐

在我们开发的项目中,有一部分可能是用于商业用途,会部署在客户提供的机器环境中。因为 PHP 本身是解释型语言,所以未进行处理的代码,就会有泄露或被修改的风险。那么我们可能会想到最简单有效的方法就是进行PHP代码的加密&#xf…

PHP数据加密的几种方式

首先我们来了解一下为什么要加密? 在网络通信的过程中攻击者可以伪造请求和返回,从而达到不可告人的目的。如下图所示: 数据加密之后可以防止他人监听窃取信息以及通讯内容被篡改。 了解了加密的作用,我再来说说加密的方式&…

php代码加密 php-screw-plus

1.下载本程序并解压到某个目录 下载 https://gitee.com/splot/php-screw-plus 2.解压 3.编译 进入目录 /usr/local/php/bin/phpize (在screw plus目录中执行php bin中的phpize自动生成扩展所需文件) ./configure --with-php-config/usr/local/php…

php代码加密

如何对PHP文件进行加密——ZendGuard加密与ZendLoader解密 end Guard是目前市面上最成熟的PHP源码加密产品。 经过本人搜集资料,亲身测试后,总结了如何利用Zend Guard对PHP文件进行加密,以及如何利用Zend Loader对加密后的PHP文件进行解密。 …

php7 加密扩展,一个PHP7 代码的加密扩展,

一个PHP7 代码的加密扩展是PHP7代码的加密扩展, PHP7栏目介绍如何加密扩展 推荐:PHP7 介绍 一个简洁高效的跨 特点 简单快速,实际测量后几乎不影响性能。它与其他扩展兼容,如OPcache和Xdebug。它支持Linux、macOS、Windows等系统。…

PHP源代码加密后正常运行

因为老板想对做出来的产品进行加密防止进行修改,和源代码的流逝,让我们看看有没有加密的方法。所以通过网上找到了相关的一些教程,还可以,记录一下 在这使用的是 php screw plus github地址 https://github.com/del-xiong/screw-p…

看我如何玩转PHP代码加密与解密

参考文献: https://xz.aliyun.com/t/2403 前言 两次比赛,两个题目,两种方式,两个程序。 一切PHP的代码终究是要到Zend Engine上走一走的,因此一切PHP的源码加密都是可以被解密的。(不包括OpCode混淆-VM…

一文打尽PHP代码加密方式

原文地址 温馨提示:世界上没有破不了的密码,如果有那也只是时间问题。 我们能做的只是增加破解时间。如果这个破解时间大于一个人的寿命,那么这个加密方式肯定是成功的。 对于加密的程序,就像破解者需要了解、猜测编写者的思路…

大数据运维工程师面试

当前你们公司使用的Hadoop版本是什么 ambari2.5.1 Hadoop 2.7.3.2.6.2.14-5HDFS常见的数据压缩格式有哪些,介绍其中一种详细的实现方式 1 gzip压缩 优点:压缩率比较高,而且压缩/解压速度也比较快;hadoop本身支持,在…

Linux运维工程师常见基础面试题

1、tcp三次握手四次挥手详解 TCP是一种面向连接的协议,通信前需要建立连接,通信结束后需要释放连接。TCP通过三次握手建立连接,四次挥手释放连接。 三次握手: 1、客户端向服务器发送SYN包,表示请求建立连接。 2、服务…

运维工程师面试总结(含答案)

运维工程师面试总结 原文链接:https://www.cuiliangblog.cn/detail/article/2 一、linux 1. linux系统启动流程 第一步:开机自检,加载BIOS第二步:读取MBR第三步:Boot Loader grub…

Linux运维工程师面试题(1)

文章目录 Linux运维工程师面试题(1)1 别名、内部命令、外部命令的执行顺序2 linux 系统启动流程3 破解用户密码的方法4 忘记 grub 密码怎么解决5 硬盘空间满了怎么处理,怎么找到硬盘中的大文件6 硬盘明明有很多空间,为什么无法存储…

Linux运维工程师面试题整理

1.Nginx反向代理,负载均衡,动静分离,工作原理及优化 nginx配置反向代理。 vim Nginx.conf Server模块中配置 Listen 80 Server_name ip; 在server段里面的location加上proxy_pass http://ip:端口; Nginx配置完成后重启一下nginx。 配…

FastReport打印标签

1、选择标签向导 2、在这里可以选择自己想要的标签布局,也可以点击左下角的自定义标签 3、点击自定义标签后,可以自定义自己想要的标签 4、点击确定之后,可以在制造商找到自定义,选择自定义的标签1 5、然后可以在数据区自定义想要…

深度学习训练数据打标签过程

深度学习训练数据打标签过程 为了获取大量的图片训练数据,在采集数据的过程中常用视频的方式采集数据,但对于深度学习,训练的过程需要很多的有有标签的数据,这篇文章主要是解决视频文件转换成图片文件,并加标签&#…

k8s-节点打标签

node标签设置后,pod可以根据要求让pod调度到想要的节点上运行,或者不在某节点运行。或者确保pod调度到具有高性能(比如ssd的机器)的节点山上。 1.展示节点标签: kubectl get node --show-labelstrue2.添加节点标签 …