更新時間:2021-09-10 11:08:47 來源:動力節(jié)點 瀏覽1559次
spring定時器及cron表達式(quartz中時間表達式)
在Spring中有兩種流行配置:JavaTimer類和OpenSymphony的Quartz。
首先繼承java.util.TimerTask類實現(xiàn)run方法
imp<wbr>ort java.util.TimerTask;<br> public class EmailReportTask extends TimerTask{<br> @Override<br> public void run() {<br> ...<br> }<br> }</wbr>
例如
Task.java
imp<wbr>ort java.util.TimerTask;</wbr>
public class Task extends TimerTask ...{
private String id;
public Task(String id)...{
this.id = id;
}
@Override
public void run() ...{
System.out.println(id+" is running...");
}
}
Test .java
imp<wbr>ort java.util.Date;<br> imp<wbr>ort java.util.Timer;<br> imp<wbr>ort java.util.TimerTask;</wbr></wbr></wbr>
public class Test ...{
/** *//**
* @param args
*/
public static void main(String[] args) ...{
Timer timer = new Timer();
TimerTask t1 = new Task("t1");
TimerTask t2 = new Task("t2");
//1000毫秒后,每隔1000毫秒運行一次t1任務(wù)
timer.schedule(t1,1000,1000);
//從現(xiàn)在開始,每隔500毫秒運行一次t2任務(wù)
timer.schedule(t2, new Date(),500);
try ...{
Thread.sleep(10000);
} catch (InterruptedException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
timer.cancel();
System.out.println("---end---");
}
}
在Spring定義
<bean id="reportTimerTask" class="EmailReportTask">...</bean>
配置定時器
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000</value>
</property>
</bean>
timerTask屬性告訴ScheduledTimerTask運行哪個。86400000代表24個小時
啟動定時器
Spring的TimerFactoryBean負責啟動定時任務(wù)
<bean class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list><ref bean="scheduleReportTask"/></list>
</property>
</bean>
scheduledTimerTasks里顯示一個需要啟動的定時器任務(wù)的列表。
可以通過設(shè)置delay屬性延遲啟動
<bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="reportTimerTask" />
<property name="period">
<value>86400000</value>
</property>
<property name="delay">
<value>3600000</value>
</property>
</bean>
這個任務(wù)我們只能規(guī)定每隔24小時運行一次,無法精確到某時啟動
首先繼承QuartzJobBean類實現(xiàn)executeInternal方法
imp<wbr>ort org.quartz.JobExecutionContext;<br> imp<wbr>ort org.quartz.JobExecutionException;<br> imp<wbr>ort org.springframework.scheduling.quartz.QuartzJobBean;</wbr></wbr></wbr>
public class EmailReportJob extends QuartzJobBean{
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
...
}
}
在Spring中定義
<bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>EmailReportJob</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="courseService">
<ref bean="courseService"/>
</entry>
</map>
</property>
</bean>
在這里我們并沒有直接聲明一個EmailReportJob Bean,而是聲明了一個JobDetailBean。這個是Quartz的特點。JobDetailBean是Quartz的org.quartz.JobDetail的子類,它要求通過jobClass屬性來設(shè)置一個Job對象。
使用Quartz的JobDetail中的另一個特別之處是EmailReportJob的courseService屬性是間接設(shè)置的。JobDetail的jobDataAsMap屬性接受一個Map,包括設(shè)置給jobClass的各種屬性,當。JobDetailBean實例化時,它會將courseService Bean注入到EmailReportJob 的courseService 屬性中。
啟動定時器
Quartz的org.quartz.Trigger類描述了何時及以怎樣的頻度運行一個Quartz工作。Spring提供了兩個觸發(fā)器SimpleTriggerBean和CronTriggerBean。
SimpleTriggerBean與scheduledTimerTasks類似。指定工作的執(zhí)行頻度,模仿scheduledTimerTasks配置
<bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="reprotJob" />
<property name="startDelay">
<value>360000</value>
</property>
<property name="repeatInterval">
<value>86400000</value>
</property>
</bean>
startDelay也是延遲1個小時啟動
CronTriggerBean指定工作的準確運行時間
<bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reprotJob" />
<property name="cronExpression">
<value>0 0 6 * * ?</value>
</property>
</bean>
屬性cronExpression告訴何時觸發(fā)。最神秘就是cron表達式:
Linux系統(tǒng)的計劃任務(wù)通常有cron來承擔。一個cron表達式有至少6個(也可能7個)有空格分隔的時間元素。從左到右:
1.秒2.分3.小時4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份(1970-2099)
每個元素都顯示的規(guī)定一個值(如6),一個區(qū)間(9-12),一個列表(9,11,13)或一個通配符(*)。因為4和6這兩個元素是互斥的,因此應(yīng)該通過設(shè)置一個問號(?)來表明不想設(shè)置的那個字段,“/”如果值組合就表示重復(fù)次數(shù)(10/6表示每10秒重復(fù)6次)。
啟動定時器
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref bean="cronReportTrigger"/></list>
</property>
</bean>
triggers屬性接受一組觸發(fā)器。
以上就是動力節(jié)點小編介紹的"Spring定時器及cron表達式",希望對大家有幫助,想了解更多可查看Spring框架教程。動力節(jié)點在線學(xué)習(xí)教程,針對沒有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。