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();  
}
相关推荐
Yhame.20 分钟前
Java 集合框架中的 List、ArrayList 和 泛型 实例
java
coding侠客21 分钟前
Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘
java·spring boot·后端
委婉待续26 分钟前
java抽奖系统(八)
java·开发语言·状态模式
weixin_537590451 小时前
《Java编程入门官方教程》第八章练习答案
java·开发语言·servlet
CodeClimb1 小时前
【华为OD-E卷-最左侧冗余覆盖子串 100分(python、java、c++、js、c)】
java·python·华为od
Q_19284999062 小时前
基于Spring Boot的大学就业信息管理系统
java·spring boot·后端
xmh-sxh-13142 小时前
常用数据库类型介绍
java
single5942 小时前
【c++笔试强训】(第四十一篇)
java·c++·算法·深度优先·图论·牛客
1 9 J2 小时前
Java 上机实践11(组件及事件处理)
java·开发语言·学习·算法