1. 程式人生 > >java spring-quartz定時器實現定時任務

java spring-quartz定時器實現定時任務

Quartz是一個大名鼎鼎的Java版開源定時排程器,功能強悍,使用方便,下面我們看看如何使用它
一、核心概念
Quartz的原理不是很複雜,只要搞明白幾個概念,然後知道如何去啟動和關閉一個排程程式即可。

1、Job

表示一個工作,要執行的具體內容。此介面中只有一個方法
void execute(JobExecutionContext context)

2、JobDetail

JobDetail表示一個具體的可執行的排程程式,Job是這個可執行程排程程式所要執行的內容,另外JobDetail還包含了這個任務排程的方案和策略。

3、Trigger

代表一個排程引數的配置,什麼時候去調。

4、Scheduler

代表一個排程容器,一個排程容器中可以註冊多個JobDetail和Trigger。當Trigger與JobDetail組合,就可以被Scheduler容器排程了。

二、具體配置

下邊是一個任務的配置檔案,需要把這個檔案加到Spring配置檔案applicationContext.xml中,格式:
<import resource="classpath:queryexpirescaletask.xml"/>
queryexpirescaletask.xml配置檔案內容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <!-- 查詢--> <!-- 定時服務定義 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 自動啟動 --> <property
name="autoStartup">
<value>true</value> </property> <property name="triggers"> <list> <ref bean="cronTriggerBean" /> </list> </property> </bean> <bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobDetailBean" /> </property> <property name="cronExpression"> <!-- 凌晨1點開始--> <value>0 0 1 * * ?</value> </property> </bean> <bean id="jobDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 執行任務的類 --> <property name="targetObject" ref="queryFailScale"></property> <!-- 執行任務的方法 --> <property name="targetMethod" value="run"></property> <property name="concurrent" value="false" /> </bean> <!-- 執行任務的類對映類,使用者執行操作 --> <bean id="queryFailScale" class="org.duang.task.QueryFailScale"></bean> </beans>
QueryFailScale類就是處理定時任務的操作
public class QueryFailScale{
    private Properties properties;
    //判斷作業是否執行的旗標  
    private boolean isRunning = false;
    //定義任務執行體  
    public void run()    
    {  
        if (!isRunning)  
        {  
             LoggerUtils.info("-------定時任務開始", this.getClass());

        }  
    }
   }
}  

三、透過例項看原理

通過研讀Quartz的原始碼,和本例項,終於悟出了Quartz的工作原理。

1、scheduler是一個計劃排程器容器(總部),容器裡面可以盛放眾多的JobDetail和trigger,當容器啟動後,裡面的每個JobDetail都會根據trigger按部就班自動去執行。
2、JobDetail是一個可執行的工作,它本身可能是有狀態的。
3、Trigger代表一個排程引數的配置,什麼時候去調。
4、當JobDetail和Trigger在scheduler容器上註冊後,形成了裝配好的作業(JobDetail和Trigger所組成的一對兒),就可以伴隨容器啟動而排程執行了。
5、scheduler是個容器,容器中有一個執行緒池,用來並行排程執行每個作業,這樣可以提高容器效率。

四、總結

1、搞清楚了上Quartz容器執行作業的的原理和過程,以及作業形成的方式,作業註冊到容器的方法。就認識明白了Quartz的核心原理。

2、Quartz雖然很龐大,但是一切都圍繞這個核心轉,為了配置強大時間排程策略,可以研究專門的CronTrigger。要想靈活配置作業和容器屬性,可以通過Quartz的properties檔案或者XML來實現。

3、要想排程更多的持久化、結構化作業,可以通過資料庫讀取作業,然後放到容器中執行。

4、所有的一切都圍繞這個核心原理轉,搞明白這個了,再去研究更高階用法就容易多了。

5、Quartz與Spring的整合也非常簡單,Spring提供一組Bean來支援:MethodInvokingJobDetailFactoryBean、SimpleTriggerBean、SchedulerFactoryBean,看看裡面需要注入什麼屬性即可明白了。Spring會在Spring容器啟動時候,啟動Quartz容器。

6、Quartz容器的關閉方式也很簡單,如果是Spring整合,則有兩種方法,一種是關閉Spring容器,一種是獲取到SchedulerFactoryBean例項,然後呼叫一個shutdown就搞定了。如果是Quartz獨立使用,則直接呼叫scheduler.shutdown(true);

7、Quartz的JobDetail、Trigger都可以在執行時重新設定,並且在下次呼叫時候起作用。這就為動態作業的實現提供了依據。你可以將排程時間策略存放到資料庫,然後通過資料庫資料來設定Trigger,這樣就能產生動態的排程。