簡介
Quartz是一個完全由java編寫的開源作業調度框架,它可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。爲確保可伸縮性,Quartz採用了基於多線程的架構。啓動時,框架初始化一套worker線程,這套線程被調度器用來執行預定的作業。這就是Quartz怎樣能併發運行多個作業的原理。Quartz依賴一套鬆耦合的線程池管理部件來管理線程環境。
特點
- 可集羣
- 可伸縮性
- 高可用性
- 負載均衡
整合示例
1. 使用maven配置示例所需依賴包
<properties>
<springframework.version>4.0.6.RELEASE</springframework.version>
<quartz.version>2.2.1</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>
<!-- spring-tx包必須導入,因爲Quartz需要依賴該包 -->
<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>
2. 配置任務調度執行類,這裏有兩種方式,第一種方式也是最簡單的配置方式
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--指定任務執行的目標Bean-->
<property name="targetObject" ref="oneBean" />
<!--指定任務執行類的目標方法-->
<property name="targetMethod" value="outMessage" />
</bean>
第二種適合處理複雜的業務需求
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.os.china.ScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="towBean" value-ref="towBean" />
</map>
</property>
<property name="durability" value="true" />
</bean>
注:jobClass 一個繼承自 QuartzJobBean 的自定義類,需要實現 executeInternal 方法。
jobDataMap 配置所有需要處理的任務類,本示例配置的是 TowBean。
編寫自定義 ScheduledJob 類
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class ScheduledJob extends QuartzJobBean{
private TowBean towBean;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
towBean.outMessage();
}
public void setTowBean(TowBean towBean) {
this.towBean = towBean;
}
}
3. 任務觸發器配置,這裏也有兩種配置方式,第一種使用 SimpleTriggerFactoryBean 觸發器
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!--配置具體要執行的jobDetail-->
<property name="jobDetail" ref="simpleJobDetail" />
<!--初始延遲時間 1s-->
<property name="startDelay" value="1000" />
<!--間隔執行時間每2s執行一次-->
<property name="repeatInterval" value="2000" />
</bean>
第二種使用 CronTriggerFactoryBean 觸發器,使用該觸發器可以配置出各種複雜的任務執行規則
<!--週日沒隔5秒執行一次-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail" />
<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />
</bean>
4. 配置 SchedulerFactoryBean,來管理和調度任務的執行
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="simpleJobDetail" />
<ref bean="complexJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
</bean>
5. 完整的 quartz-context.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
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">
<context:component-scan base-package="com.os.china" />
<!-- 最簡單的JobDetail配置 -->
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--指定任務執行的目標Bean-->
<property name="targetObject" ref="oneBean" />
<!--指定任務執行類的目標方法-->
<property name="targetMethod" value="outMessage" />
</bean>
<!-- 除了上面最簡單的JobDetail配置外,還可以使用另外一種配置JobDetail的方式,
該配置方式可處理更加複雜的業務需求 -->
<bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.os.china.ScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="towBean" value-ref="towBean" />
</map>
</property>
<property name="durability" value="true" />
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!--配置具體要執行的jobDetail-->
<property name="jobDetail" ref="simpleJobDetail" />
<!--初始延遲時間 1s-->
<property name="startDelay" value="1000" />
<!--間隔執行時間每2s執行一次-->
<property name="repeatInterval" value="2000" />
</bean>
<!--週日沒隔5秒執行一次-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="complexJobDetail" />
<property name="cronExpression" value="0/5 * * ? * SAT-SUN" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="simpleJobDetail" />
<ref bean="complexJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
</bean>
</beans>
6. 創建任務類OneBean
import org.springframework.stereotype.Component;
/**
* 第一個任務執行Bean
* @author ZhangPengFei
* @Discription
* @Data 2017-2-25
* @Version 1.0.0
*/
@Component
public class OneBean {
public void outMessage(){
System.out.println("hello 我是第一個任務執行類");
}
}
7. 創建任務類TowBean
import org.springframework.stereotype.Component;
/**
* 第二個任務執行Bean
* @author ZhangPengFei
* @Discription
* @Data 2017-2-25
* @Version 1.0.0
*/
@Component
public class TowBean {
public void outMessage(){
System.out.println("hello 我是第二個任務執行類");
}
}
8. 測試
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 測試類
* @author ZhangPengFei
* @Discription
* @Data 2017-2-25
* @Version 1.0.0
*/
public class QuartzTest {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("quartz-context.xml");
}
}
9. 執行結果