java spring-quartz定時器實現定時任務
阿新 • • 發佈:2018-12-12
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,這樣就能產生動態的排程。