spring容器框架定時任務實現的兩種方式

spring容器框架自帶一種定時任務 工具 spring Task 以及另外一種定時任務設置工具Quartz。

spring Task 方式:

這種定時方式其實是一種輕量的Quartz,這種方式有兩種方法實現spring task的定時任務

1. 註解形式

直接在定時任務類上配置註解:@Component   ,  @Scheduled(cron="*/1 * * * * ?") 。

定時任務類代碼如下

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class TimeTask4 {
	
	@Scheduled(cron="*/1 * * * * ?")//每隔一分鐘執行一次定時任務
	public void doTask(){
		System.out.println("這是一個直接在類裏註解的方式的TimeTask4測試任務");
	}
}
這種註解方式同樣需要在xml配置文件中配置

  <!-- 定時任務配置spring自帶的task定時框架,輕量的quartz定時任務工具 -->
    <!-- 註解形式的定時任務timetask -->
    <context:component-scan base-package="JDKWebFrame.jobs.tasks.timetaskjobclass" /><!-- 配置需要掃描的定時任務類路徑-->
    <task:executor id="executor" pool-size="5" />  
    <task:scheduler id="scheduler" pool-size="10" />  
    <task:annotation-driven executor="executor" scheduler="scheduler" />
    

2.xml配置文件方式吧:

這種實現方式有兩種不同的方法,其中一種是spring task特有的配置方式,第二種類似於Quartz配置定時任務的方法。

a.  

   定時任務類:

public class TimeTask1 {
	
	public void doTask(){
		System.out.println("這是一個配置文件的方式TimeTask1的測試任務");
	}
}


   在xml中配置如下內容

 
    <!-- 配置文件xml形式配置定時任務timetask 第一種 -->
    
    <bean id="timeTask1" class="JDKWebFrame.jobs.tasks.timetaskjobclass.TimeTask1"/><!-- 這個是定時任務類路徑名稱-->
    <task:scheduled-tasks>
    	<task:scheduled ref="timeTask1"  method="doTask" cron="*/1 * * * * ?"/><!--在配置文件中配置定時任務運行時間週期參數-->
    </task:scheduled-tasks>

b.

   定時任務類:和上面方式的定時任務類形式一樣

public class TimeTask2 {
	
	public void doTask(){
		System.out.println("這是一個配置文件的方式的TimeTask2測試任務 --觸發時間點在配置文件中設置");
	}
}

   在xml中配置如下內容---這種方式和Quartz中MethodInvokingJobDetailFactoryBean一樣,只不過在spring task的這種方式下沒定時任務定點執行的實現。

 <!--begin 配置文件xml形式配置定時任務timetask 第二種 -->
    <!-- spring  timetask 使用 MethodInvokingTimerTaskFactoryBean-->
    <bean id = "timerTask3" class="JDKWebFrame.jobs.tasks.timetaskjobclass.TimeTask2" />	
    <bean id = "timerBean3" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
    	<property name="targetObject" ref="timerTask3"/>
    	<property name="targetMethod" value="doTask"/>
    </bean>
    <bean id = "task3" class="org.springframework.scheduling.timer.ScheduledTimerTask">	
    	<property name="delay" value="3000"/>
    	<property name="period" value="1000"/>
    	<property name="timerTask" ref="timerBean3"/>
    </bean>
    
    <!-- timerfactorybean -->
    <bean id = "timefactorybean" class="org.springframework.scheduling.timer.TimerFactoryBean"> 
    	<property name="scheduledTimerTasks">
    			<list>
    				<ref bean="task3"/>	
    			</list>
    	</property>
    </bean>
    
    <!--end 配置文件xml形式配置定時任務timetask 第二種 -->

以上就是spring task實現的幾種方式

下面就來看看Quartz定時任務實現方式

總的來說,Quartz定時任務方式就是在於JobDetail生成方式的不同,一種是直接生成JobDetailBean,另一種是通過工廠類方式生成JobDetailBean,詳細見下面代碼

a. 直接生成方式,任務類繼承QuartzJobBean類

                       任務類:

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/*
 * 測試spring Quartz的不使用 org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
 * 工作類繼承org.springframework.scheduling.quartz.QuartzJobBean
 */
public class QuartzJob1  extends QuartzJobBean{

	@Override
	protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		
		System.out.println("配置方式測試spring quartz 使用  QuartzJobBean的方式");
	}

}

在xml中生成JobDetail配置內容
<bean id = "jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass" value="JDKWebFrame.jobs.quartzs.quartzsjobclass.QuartzJob1"/>
		<property name="jobDataAsMap">
			<map>
				<entry key="timeout" value="0" />
			</map>
		</property>
</bean>


b. 通過工廠類方式生成JobDetailBean的方式

  任務類是一個普通類:

public class QuartzJob2 { 

	
	public void doSomething(){
		System.out.println("配置方式測試spring quartz 使用  MethodInvokingJobDetailFactoryBean的方式");
	}
}

在xml中配置內容如下

<bean id="jobClass" class="JDKWebFrame.jobs.quartzs.quartzsjobclass.QuartzJob2"/>
	<bean id = "jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="jobClass"/>
		<property name="targetMethod" value="doSomething"/>
		<property name="concurrent" value="false"/>
</bean>
以上就是Quartz中JobDetailBean的生成兩種方式,在這基礎上,爲定時任務關聯定時器,並將定時器注入到Quartz的定時任務管理器中去

定時器有兩種,org.springframework.scheduling.quartz.SimpleTriggerBean和org.springframework.scheduling.quartz.CronTriggerBean,一種是定點定時,一種是隔斷定時。

	<bean id = "quartzJob1cron" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="jobDetail1"/>
		<property name="cronExpression" value="0 * * * * ?"/><!-- 在每分鐘開始的時候都執行工作類 -->
	</bean>

	<bean id = "quartzJob2simple" class = "org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail" ref="jobDetail2"/>
		<property name="startDelay" value="1000"/>
		<property name="repeatInterval" value="2000"/>
	</bean>

         將上面兩種定時器注入到Quartz定時任務管理器中去,如下:

<bean id="quartzscheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">  
			<list>
				<ref bean="quartzJob1cron"/>
				<ref bean="quartzJob2simple"/>
			</list>
		</property>
		<property name="autoStartup" value="true"/>  
</bean>


以上就是spring容器框架兩種定時任務工具介紹,spring task是spring框架自帶的,至於Quartz工具,需要向項目中導入jar包:quartz-1.8.6.jar,歡迎大家討論指正,謝謝。

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