一、quartz简介
Quartz是一个开源的任务调度框架。基于定时、定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次。Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。Quartz完全使用Java开发,可以集成到各种规模的应用程序中。它能够承载成千上万的任务调度,并且支持集群。它支持将数据存储到数据库中以实现持久化,并支持绝大多数的数据库。它将任务与触发设计为松耦合,即一个任务可以对应多个触发器,这样能够轻松构造出极为复杂的触发策略。
二、环境搭建
我们需要将maven pom.xml中添加以下信息
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>settle</groupId>
<artifactId>spring-quartz</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>spring-quartz</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<springframework.version>4.2.2.RELEASE</springframework.version>
<quartz.version>2.2.2</quartz.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- Transaction dependency is required with Quartz integration -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<!-- Quartz framework -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
</dependencies>
</project>
三、简单例子
在quartz2.x中,我们只需要保证job,trigger以及Scheduler factory在applicationContext.xml中进行配置即可。
1、job执行类
我们自定义一个job执行类HeartBeatDetector,在配置完成后,其中的execute方法会按计划定期执行。
@Component("HeartBeatDetector")
public class HeartBeatDetector {
/**
* 使用quartz定时执行execute方法
* @throws JobExecutionException
*/
public void execute() throws JobExecutionException {
System.out.println("execute " + new Date());
}
}
2、job的配置
job有两种配置方式,分别是MethodInvokingJobDetailFactoryBean以及JobDetailFactoryBean。后者可以在方法中注入参数,由于没有参数需求,本次使用的是MethodInvokingJobDetailFactoryBean。
<!-- job的定义 -->
<bean id="HeartBeatDetectorJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="HeartBeatDetector" />
<property name="targetMethod" value="execute" />
</bean>
3、trigger的配置
trigger同样也有两种配置方式,分别是SimpleTriggerFactoryBean以及CronTriggerFactoryBean。我使用也推荐使用的是后者CronTriggerFactoryBean,因为后者可以设计规范的时间方案。
<!-- Trigger 触发器 -->
<bean id="HeartBeatDetectorJob_Trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="HeartBeatDetectorJob" />
<!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />-->
<property name="cronExpression" value="0/15 * * ? * *" />
</bean>
关于cronExpression,详见https://www.cnblogs.com/jearay/p/3667906.html
4、Scheduler factory的配置
Scheduler factory的配置也很简单,就是将上述定义的job和trigger作为property设置在factory中即可。
<!-- Scheduler factory bean-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="HeartBeatDetectorJob" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="HeartBeatDetectorJob_Trigger" />
</list>
</property>
</bean>
5、applicationContext-quartz完整实例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:component-scan base-package="com.YYSchedule.node.detector" />
<!-- job的定义 -->
<bean id="HeartBeatDetectorJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="HeartBeatDetector" />
<property name="targetMethod" value="execute" />
</bean>
<!-- Trigger 触发器 -->
<bean id="HeartBeatDetectorJob_Trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="HeartBeatDetectorJob" />
<!--<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />-->
<property name="cronExpression" value="0/15 * * ? * *" />
</bean>
<!-- Scheduler factory bean-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="HeartBeatDetectorJob" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="HeartBeatDetectorJob_Trigger" />
</list>
</property>
</bean>
</beans>
6、结果:
四、YYShedule具体实例:
实际代码中,仅仅对execute方法进行了修改,其他文件并不需要修改,而execute方法的具体内容,请见“新调度平台-n-
task与node进行交互具体实现”