對於定時器想必大家都應該挺清楚,就像鬧鐘一樣,在某個指定的時間點定時執行。在Java中我們可以使用quartz來定時調度自己的任務,這個框架爲我們提供很多比較方便的功能,能夠很輕易對我們的任務進行啓動、暫停以及運行週期的修改。
任務調度的意義還是挺大的,例如我們可以寫一個調度平臺來管理和監控自己寫的任務,而在這些任務中我們可以寫自己想要乾的事,比如做個生日提醒啊,只要發現當前是誰的生日,就給自己發個短信或郵件。或者在項目中完成一些特定的數據處理等。這個筆者會在下一篇博客中講到。
接下來,直入正題。
一、所依賴的jar包
一是會依賴spring相關的包,而是會依賴quartz的包,spring已經對quartz提供了支持。
<!-- quartz任務調度 -->
<dependency>
<groupId>fakepath</groupId>
<artifactId>quartz-all</artifactId>
<version>2.1.6</version>
</dependency>
<dependency>
<groupId>fakepath</groupId>
<artifactId>quartz-commonj</artifactId>
<version>2.1.6</version>
</dependency>
二、spring的中配置
首先準備兩個測試任務類,如下
TestJob.java:
package org.qiyongkang.schedule.quartz.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* ClassName:TestJob <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2015年12月18日 下午4:37:12 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class TestJob {
private Logger logger = LogManager.getLogger(TestJob.class.getName());
public void execute() {
//獲取當前時間
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("當前時間:{}", sdf.format(date));
}
}
TestJob2.java:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* ClassName:TestJob2 <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2015年12月21日 下午7:52:27 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class TestJob2 {
private Logger logger = LogManager.getLogger(TestJob2.class.getName());
public void execute() {
//獲取當前時間
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
logger.info("當前時間:{}", sdf.format(date));
}
}
然後,再來看看在spring中的配置:
spring-timer.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Scheduler的配置 -->
<bean name="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- <property name="triggers">
<list>
<ref bean="testTrigger"/>
<ref bean="testTrigger2"/>
</list>
</property> -->
<property name="autoStartup" value="false"/> <!-- 默認爲true -->
</bean>
<!-- Trigger的配置,指定job執行的時間週期 -->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail"/>
<property name="cronExpression" value="*/5 * * * * ?"/><!-- 每隔5秒鐘觸發一次 -->
</bean>
<bean id="testTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail2"/>
<property name="cronExpression" value="*/1 * * * * ?"/><!-- 每隔1秒鐘觸發一次 -->
</bean>
<!-- JobDetail的配置,指定job的執行類和執行方法 -->
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true"/>
<!-- 是否允許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->
</bean>
<bean id="testJobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob2"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true"/>
</bean>
<!-- 業務類的配置 -->
<bean id="testJob" class="org.qiyongkang.schedule.quartz.job.TestJob"/>
<bean id="testJob2" class="org.qiyongkang.schedule.quartz.job.TestJob2"/>
</beans>
這裏,我們可以配置web容器啓動後自動調度程序,也可以手動進行啓動和暫停。
三、啓動和暫停
這裏,筆者簡單的寫了這個頁面來控制這兩個任務的啓動和暫停,如下:
然後,再來看看springMVC中接受請求的代碼:
/**
*
* operateTask:任務的啓動或停止. <br/>
*
* @author qiyongkang
* @param taskName
* @param flag:0->啓動,1->停止
* @return
* @since JDK 1.6
*/
@RequestMapping
@ResponseBody
public ExtJsObject operateTask(String triggerName, String jobDetailName, Integer flag) {
ExtJsObject extJsObject = null;
Scheduler scheduler = startQuertz.getScheduler();
//獲取CronTrigger
CronTrigger cronTrigger = SpringUtil.getBean(triggerName);
//獲取jobDetail
JobDetail jobDetail = SpringUtil.getBean(jobDetailName);
try {
if (flag == 0) {
//啓動此任務
scheduler.scheduleJob(jobDetail, cronTrigger);
if (!scheduler.isStarted()) {
scheduler.start();
}
} else if (flag == 1) {
//停止此任務
scheduler.pauseTrigger(cronTrigger.getKey());
scheduler.unscheduleJob(cronTrigger.getKey());
scheduler.deleteJob(jobDetail.getKey());
}
} catch (SchedulerException e) {
e.printStackTrace();
log.error("觸發器啓動異常", e);
}
return extJsObject;
}
啓動後,控制檯的輸出如下圖:
點擊暫停後,也可以停止此任務。
好了,就先簡單的講到這兒了,希望對想使用quartz的童鞋有所幫助!