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形式配置定時任務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,歡迎大家討論指正,謝謝。