集成任務調度服務

JDK中任務調度核心是Timer類的schedule方法,傳遞一個繼承TimerTask實現了run方法的類。
在Spring的xml文件中配置
  <!-- 單一任務 -->
<bean id="reportTask" class="example.chapter9.ReportTimerTask" />

<!-- 週期性任務 -->
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 啓動後等待10秒,然後開始執行 -->
<property name="delay" value="10000" />
<!-- 每60秒執行一次 -->
<property name="period" value="60000" />
<property name="timerTask" ref="reportTask" />
</bean>

<!-- 啓動任務的工廠 -->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask" />
</list>
</property>
</bean>

<!-- 另一中建立任務的方法,reportTask不用繼承TimerTask -->
<bean id="scheduledTaskInvoke" class="
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="reportTask"/>
<property name="targetMethod" value="run"/>
</bean>


[b]
使用Quartz調度任務[/b]
Quartz中的幾個概念
Job:定義一個任務,Job只管執行,不管什麼時間執行,不管執行多少次
Trigger:定義一個出發器,表示何時觸發一個Job執行,一個Job可以和多個Trigger關聯
Scheduler:真正調度任務的調度器,通過scheduler(Job, Trigger)方法把關聯了Tragger的Job放入調度器中執行
public class SimpleQuartz {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
// 定義任務
JobDetail jobDetail = new JobDetail("myJob", null, AJob.class);
// 每3秒一次
Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
// 開始時間
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setName("myTrigger");
scheduler.scheduleJob(jobDetail, trigger);
}
}
public class AJob implements Job{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("xxxx");
}
}


Spring提供兩種方式來封裝Quartz的Job,一種是直接派生自QuartzJobBean,
public class Report extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Send report to " + name + " at " + new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

在xml配置文件中將Report包裝爲JobDetailBean
  <bean name="reportJob" 
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="example.chapter9.Report" />
<property name="jobDataAsMap">
<map>
<entry key="name" value="Micheal" />
</map>
</property>
</bean>

Spring會自動將jobDataAsMap屬性中注入的Map按照Key注入到Report對象

另一種方式是POJO實現,
public class CheckDiskFreeSpace {
public void check() {
// get disk free space:
long freeSpace = Math.random() > 0.5 ? 100000000 : 200000000;
System.out.println("Check disk free space at " + new Date());
if (freeSpace < 100 * 1024 * 1024) { // <100MB
System.out.println("Warning! Low disk free space...");
}
}
}

  <bean name="checkDiskFreeSpace" class="example.chapter9.CheckDiskFreeSpace" />
<bean name="checkDiskJob" class="
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="checkDiskFreeSpace" />
<property name="targetMethod" value="check" />
<!-- 能否同時有多個Job執行 -->
<property name="concurrent" value="false" />
</bean>



下一步是定地Trigger,
Spring封裝了兩種常用的TriggerBean,一種是SimpleTriggerBean,可以週期性執行Job
<!-- 週期性運行checkDiskJob -->
<bean id="repeatTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="checkDiskJob" />
<!-- 1分鐘後啓動 -->
<property name="startDelay" value="60000" />
<!-- 5分鐘檢查一次 -->
<property name="repeatInterval" value="300000" />
</bean>

另一種是CronTriggerBean功能更強大,能指定何時執行Job
<!-- 定時運行reportJob -->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reportJob" />
<!-- 每週週一至週五中午12:00執行 -->
<property name="cronExpression" value="0 0 12 ? * MON-FRI" />
</bean>


cronExpression表達式
字段 	  	允許值 	  	允許的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小時 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可選) 留空, 1970-2099 , - * /



最後只需啓動Scheduler
  <bean id="scheduler" 
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="repeatTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
</bean>



附表:
"0 0 12 * * ?" 每天中午12點觸發
"0 15 10 ? * *" 每天上午10:15觸發
"0 15 10 * * ?" 每天上午10:15觸發
"0 15 10 * * ? *" 每天上午10:15觸發
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發
"0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發
"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發
"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發
"0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發
"0 15 10 15 * ?" 每月15日上午10:15觸發
"0 15 10 L * ?" 每月最後一日的上午10:15觸發
"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發

至於每個符號 看看例子就好了.很簡單了.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章