quartz調度框架

       在此聲明:本文轉自原文1 ,原文2,最近抓取競對的網站數據,需要作業調度框架。作業調度是非常重要的概念,覺得幾篇文章對於初始Quartz不錯,在此轉發以擴大影響,不過覺得原文有些不可取的地方,望大家甄別,同時希望能幫助廣大的開發者,在此對原文作者表示感謝!      

       最近在公司做抓取競對web數據的爬蟲,由於數據量比較大,不可能全量實時更新,所以採用輪詢的定時任務來定期抓取數據。

      Quartz由java編寫的開源作業調度框架,可以用來快速地創建一個實現org.quartz.Job接口的java類。Job接口包含唯一的方法:

public void execute(JobExecutionContext context)   throws JobExecutionException;

       在你的Job接口實現類裏面,添加一些邏輯到execute()方法,剩下的事就交給Quartz了。在進行web開發時,很多時候只需要配置一下即可。

1、Scheduler的配置

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
       <property name="triggers">  
           <list>  
              <ref bean="testTrigger"/>  
           </list>  
       </property>  
       <property name="autoStartup" value="true"/>  
</bean>  

    說明:Scheduler包含一個Trigger列表,每個Trigger表示一個作業。
2、Trigger的配置
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
       <property name="jobDetail" ref="testJobDetail"/>  
       <property name="cronExpression" value="*/1 * * * * ?"/><!-- 每隔1秒鐘觸發一次 -->  
</bean>  

3、Job的配置
3.1)、JobDetail的配置

<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">   
        <property name="targetObject" ref="testJob"/>  
        <property name="targetMethod" value="execute"/>  
        <property name="concurrent" value="false"/>
        <!-- 是否允許任務併發執行。當值爲false時,表示必須等到前一個線程處理完畢後纔再啓一個新的線程 -->  
</bean>  
3.2)、業務類的配置
<bean id="testJob" class="com.cjm.web.service.quartz.TestJob"/>  



注意:
    在Spring配置和Quartz集成內容時,有兩點需要注意
1、在<Beans>中不能夠設置default-lazy-init="true",否則定時任務不觸發,如果不明確指明default-lazy-init的值,默認是false。
2、在<Beans>中不能夠設置default-autowire="byName"的屬性,否則後臺會報org.springframework.beans.factory.BeanCreationException錯誤,這樣就不能通過Bean名稱自動注入,必須通過明確引用注入

 <!-- 設置Spring的監聽,項目啓動時候初始化 -->  
 <listener>  
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
 </listener>  
 <!-- 指定Spring配置文件的路徑 -->  
 <context-param>   
      <param-name>contextConfigLocation</param-name>   
      <param-value>/WEB-INF/classes/applicationContext.xml</param-value>    
 </context-param>   

下面是一段比較完整的配置:

	<!-- Timer schedule -->

	<!--要調度的對象-->
	<bean id="jobBean" class="net.xsbiz.common.MakeHtml" />
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="jobBean" />
		<property name="targetMethod" value="execute" />
		<!--將併發設置爲false-->
		<property name="concurrent" value="false" />
	</bean>

	<bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
 		<property name="jobDetail" ref="jobDetail" />
                 <!--表達式,我的是每 30 執行一次-->
                <property name="cronExpression" value="0/30 * * * * ?" />
	</bean>

	<!--  總管理類如果將lazy-init='false'那麼容器啓動就會執行調度程序   -->
	<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >
 		<property name="triggers">
 			<list>
 				<!--作業調度器,list下可加入其他的調度器-->
				<ref bean="trigger" />
 			</list>
		</property>
	</bean>


下面解釋一下具體組件的作用:

1、JobDetail

       JobDetail是一個具體的類,具體需調度作業相關類;
2、Trigger

      觸發器,用於定義 Job 何時執行。最常用的是 SimpleTrigger 和 CronTrigger 。一般來說,如果你需要在一個固定的時間和重複次數或者一個固定的間隔時間,那麼 SimpleTrigger 比較合適;如果你有許多複雜的作業調度,那麼 CronTrigger 比較合適。 CronTrigger 和 Unix 的 cron 機制基本一樣,我們需要的只是一個 cron 表達式。比如“ 0 0 12 * * ? ”會在每天中午 12 點觸發 執行;“ 0 15 10 ? * 6L ”會在每個月的最後一個星期五的早上 10:15 觸發 Job 執行;
3、Scheduler 

      定時任務管理器,Scheduler和SchedulerFactory : Scheduler 負責管理 Trigger 、調度 Job , SchedulerFactory 則是 Scheduler 工廠,負責生成 Scheduler 。

    

     在此聲明:本文轉自原文1 ,原文2,最近抓取競對的網站數據,需要作業調度框架。作業調度是非常重要的概念,覺得幾篇文章對於初始Quartz不錯,在此轉發以擴大影響,不過覺得原文有些不可取的地方,望大家甄別,同時希望能幫助廣大的開發者,在此對原文作者表示感謝!





發佈了475 篇原創文章 · 獲贊 78 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章