Spring 4 + Quartz(任務調度框架)詳解 頂 原 薦

簡介

    Quartz是一個完全由java編寫的開源作業調度框架,它可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。爲確保可伸縮性,Quartz採用了基於多線程的架構。啓動時,框架初始化一套worker線程,這套線程被調度器用來執行預定的作業。這就是Quartz怎樣能併發運行多個作業的原理。Quartz依賴一套鬆耦合的線程池管理部件來管理線程環境。

特點

  1. 可集羣
  2. 可伸縮性
  3. 高可用性
  4. 負載均衡

整合示例

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. 執行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章