Quartz
本文包括Quartz 的基本概念、Spring 集成 Quartz 的方式、Quartz 的常用配置选项、Quartz Job 的实现方法等
- Quartz 的基本概念
Quartz 是一个轻量级的任务调度框架,能够在指定时间点或时间间隔内触发任务执行。在 Quartz 中,最基本的任务调度单元是 Job(任务),它通过实现 Job 接口来定义具体的执行逻辑。在 Job 中,我们可以编写任务逻辑,访问外部资源、调用 REST API、发送邮件等等。Quartz 中的 Job 是可以参数化的,即可以通过 JobDataMap 来传递参数。
Quartz 中的任务调度基于 Scheduler(调度器)和 Trigger(触发器)。Scheduler 是负责接受调度请求、计算出下一次任务执行时间、执行任务等等的调度引擎;Trigger 则是触发任务的时机,可以基于一个固定的时间表、一个 Cron 表达式或者其他条件来触发任务的执行。
- Spring 集成 Quartz 的方式
在 Spring 框架中,我们可以通过 Spring 集成 Quartz 的方式来使用 Quartz 任务调度框架。Spring 提供了两种集成方式:使用 SchedulerFactoryBean 和使用 QuartzJobBean。
在第一种方式中,我们需要配置一个 SchedulerFactoryBean 实例,它会自动创建一个 Scheduler 对象,并负责管理 Trigger 和 JobDetail 对象的生命周期。SchedulerFactoryBean 会自动地将 Trigger 和 JobDetail 注册到 Scheduler 中,从而实现任务的调度和执行。此外,SchedulerFactoryBean 还支持持久化和集群模式等高级特性。
在第二种方式中,我们需要在 Job 实现类上添加一个 @PersistntJobData 配置注解,然后编写一个 QuartzJobBean 的子类来封装 Job 实现逻辑。在具体的任务配置中,我们只需要指定 Trigger 和 JobDetail 的相关属性,即可将任务注册到 Scheduler 中。
下面,我们将演示如何使用 SchedulerFactoryBean 完成一个基本的定时任务调度应用。
- Quartz 的基本配置
要想使用 Quartz,我们需要在 Spring 配置文件中声明一个 SchedulerFactoryBean bean。该 bean 封装了 Quartz 的 Scheduler。
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
其中,triggers 属性是一个 Trigger 数组,用来指定所有的 Trigger 对象。在这个例子中,我们只使用了一个 cronTrigger。
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
这里我们使用 CronTriggerFactoryBean 类创建一个触发器 cronTrigger。该类继承自 SimpleTriggerFactoryBean,因此创建 CronTrigger 对象前我们需要先创建一个 JobDetail 对象。
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.example.demo.task.HelloJob" />
</bean>
这里我们创建了一个 JobDetail 对象 jobDetail,它将使用 HelloJob 类的 executeInternal() 方法来执行任务。
- Quartz Job 的实现方法
我们需要实现 Job 接口来定义具体的任务逻辑。
public class HelloJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello World!");
}
}
该 Job 只包含一个 execute() 方法,负责打印一条"Hello World!" 的信息。此外,我们还可以添加其它方法和属性来支持更复杂的任务逻辑。
- 完整代码示例
下面是一个完整的 Quartz 任务调度示例,演示了如何在 Spring 中使用 SchedulerFactoryBean 配置 Quartz 任务调度,然后通过 JobDetail 和 Trigger 对象来定义任务和任务触发条件。
首先,我们需要在 pom.xml 文件中引入相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
然后,我们需要在 Spring 配置文件中声明一个 SchedulerFactoryBean bean:
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
接着,我们需要声明一个 JobDetail 对象:
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.example.demo.task.HelloJob" />
</bean>
然后声明一个触发器:
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
最后,我们需要在代码中实现 Job 接口的 execute() 方法:
public class HelloJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello World!");
}
}
这样,当触发器符合条件时,就会执行 execute() 方法并打印出 “Hello World!” 的信息。
可以在控制台中看到 “Hello World!” 的信息。这表明任务调度已经生效。在这个例子中,任务每 5 秒钟执行一次。