在此聲明:本文轉自原文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不錯,在此轉發以擴大影響,不過覺得原文有些不可取的地方,望大家甄別,同時希望能幫助廣大的開發者,在此對原文作者表示感謝!