框架-quartz

          一:quartz簡介
                 OpenSymphony 的Quartz提供了一個比較完美的任務(wù)調(diào)度解決方案。
                 Quartz 是個開源的作業(yè)調(diào)度框架,定時調(diào)度器,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡單卻強(qiáng)大的機(jī)制。
                 Quartz中有兩個基本概念:作業(yè)和觸發(fā)器。作業(yè)是能夠調(diào)度的可執(zhí)行任務(wù),觸發(fā)器提供了對作業(yè)的調(diào)度

          二:quartz spring配置詳解
          •  為什么不適用java.util.Timer結(jié)合java.util.TimerTask 
                  1.主要的原因,適用不方便,特別是制定具體的年月日時分的時間,而quartz使用類似linux上的cron配置,很方便的配置每隔時間執(zhí)行觸發(fā)。

                  2.其次性能的原因,使用jdk自帶的Timer不具備多線程,而quartz采用線程池,性能上比timer高出很多。


          •    詳解quartz在spring里面的配置
              在spring里主要分為兩種使用方式:第一種,也是目前使用最多的方式,spring提供的MethodInvokingJobDetailFactoryBean代理類,通過雷利類直接調(diào)用任務(wù)類的某個函數(shù);第二種,程序里實(shí)現(xiàn)quartz接口,quartz通過該接口進(jìn)行調(diào)度。

                主要講解通過spring提供的代理類MethodInvokingJobDetailFactoryBean

                  1.業(yè)務(wù)邏輯類:業(yè)務(wù)邏輯是獨(dú)立的,本身就與quartz解耦的,并沒有深入進(jìn)去,這對業(yè)務(wù)來講是很好的一個方式。

                                  public class  TestJobTask{
               

                /**
                 *業(yè)務(wù)邏輯處理
                 
          */
                  public void   service(){
                      /**業(yè)務(wù)邏輯*/
                          ..
                  }

          }
                 
              2.增加一個線程池
              <!-- 線程執(zhí)行器配置,用于任務(wù)注冊 -->
          <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
           <property name="corePoolSize" value="10" />
           <property name="maxPoolSize" value="100" />
           <property name="queueCapacity" value="500" />
          </bean>

            3.定義業(yè)務(wù)邏輯類

              <!-- 業(yè)務(wù)對象 -->
          <bean id="testJobTask" class="com.mike.scheduling.TestJobTask" />


              4.增加quartz調(diào)用業(yè)務(wù)邏輯

              <!-- 調(diào)度業(yè)務(wù) -->
          <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
           <property name="targetObject" ref="testJobTask" />
           <property name="targetMethod" value="service" />
          </bean>

              5.增加調(diào)用的觸發(fā)器,觸發(fā)的時間,有兩種方式:

               第一種觸發(fā)時間,采用類似linux的cron,配置時間的表示發(fā)出豐富  
            <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
           <property name="jobDetail" ref="jobDetail" />
           <property name="cronExpression" value="10 0/1 * * * ?" />
          </bean>
            Cron表達(dá)式“10 */1 * * * ?”意為:從10秒開始,每1分鐘執(zhí)行一次 
            
              第二種,采用比較簡話的方式,申明延遲時間和間隔時間
            <bean id="taskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
           <property name="jobDetail" ref="jobDetail" />
           <property name="startDelay" value="10000" />
           <property name="repeatInterval" value="60000" />
          </bean>
            延遲10秒啟動,然后每隔1分鐘執(zhí)行一次 

              6.開始調(diào)用

                <!-- 設(shè)置調(diào)度 -->
          <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
           <property name="triggers">
            <list>
             <ref bean="cronTrigger" />
            </list>
           </property>
           <property name="taskExecutor" ref="executor" />
          </bean>

             7.結(jié)束:啟動容器即可,已經(jīng)將spring和quartz結(jié)合完畢。

              Cron常用的表達(dá)式
              "0 0 12 * * ?" 每天中午12點(diǎn)觸發(fā)
          "0 15 10 ? * *" 每天上午10:15觸發(fā)
          "0 15 10 * * ?" 每天上午10:15觸發(fā)
          "0 15 10 * * ? *" 每天上午10:15觸發(fā)
          "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發(fā)
          "0 * 14 * * ?" 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
          "0 0/5 14 * * ?" 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
          "0 0/5 14,18 * * ?" 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
          "0 0-5 14 * * ?" 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
          "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發(fā)
          "0 15 10 ? * MON-FRI" 周一至周五的上午10:15觸發(fā)
          "0 15 10 15 * ?" 每月15日上午10:15觸發(fā)
          "0 15 10 L * ?" 每月最后一日的上午10:15觸發(fā)
          "0 15 10 ? * 6L" 每月的最后一個星期五上午10:15觸發(fā) 
          "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一個星期五上午10:15觸發(fā)
          "0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發(fā)

          三:quartz原理

              根據(jù)上面spring的配置,我們就比較清楚quartz的內(nèi)部情況,下面我們主要詳解配置涉及到的每個點(diǎn)
              1.我們先從最后一個步驟看起,SchedulerFactoryBean ,scheduler的工廠實(shí)現(xiàn),里面可以生產(chǎn)出對應(yīng)的多個jobDetail和trigger,每個jobDetail對應(yīng)trigger代表一個任務(wù)
                   Quartz的SchedulerFactory是標(biāo)準(zhǔn)的工廠類,不太適合在Spring環(huán)境下使用。此外,為了保證Scheduler能夠感知 Spring容器的生命周期,完成自動啟動和關(guān)閉的操作,必須讓Scheduler和Spring容器的生命周期相關(guān)聯(lián)。以便在Spring容器啟動后, Scheduler自動開始工作,而在Spring容器關(guān)閉前,自動關(guān)閉Scheduler。為此,Spring提供 SchedulerFactoryBean,這個FactoryBean大致?lián)碛幸韵碌墓δ埽?nbsp;
               1)以更具Bean風(fēng)格的方式為Scheduler提供配置信息; 
               2)讓Scheduler和Spring容器的生命周期建立關(guān)聯(lián),相生相息; 
               3)通過屬性配置部分或全部代替Quartz自身的配置文件。 
            2.jobDetail,表示一個可執(zhí)行的業(yè)務(wù)調(diào)用
            
            3.trigger:調(diào)度的時間計(jì)劃,什么時候,每隔多少時間可執(zhí)行等時間計(jì)劃

            4.ThreadPoolTaskExecutor,線程池,用來并行執(zhí)行每個對應(yīng)的job,提高效率,這也是上面提到不推薦使用jdk自身timer的一個很重要的原因

          posted on 2012-07-03 14:42 陳睿 閱讀(3092) 評論(2)  編輯  收藏 所屬分類: 框架

          評論

          # re: 框架-quartz 2012-08-09 12:42 caiwei

          飄過,學(xué)習(xí)。。。。。嘻嘻  回復(fù)  更多評論   

          # re: 框架-quartz 2016-06-02 21:14 csj

          為啥我寫的定時任務(wù)在本地的window機(jī)上可以正常執(zhí)行,但是部署到服務(wù)器上就不執(zhí)行了,服務(wù)器是linux環(huán)境,這個跟操作系統(tǒng)有關(guān)系嗎?配置文件是這樣的:<bean id="ermsFilePushJob" class="net.soft.service.message.schedule.ErmsFilePushJob"/>

          <!-- 調(diào)度業(yè)務(wù) -->

          <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
          <property name="targetObject">
          <ref bean="ermsFilePushJob" />
          </property>
          <property name="targetMethod">
          <value>executePush</value>
          </property>
          </bean>
          <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
          <property name="jobDetail" ref="jobDetail" />
          <property name="cronExpression" value="0 0 0 * * ?" />
          </bean> -->
          <!-- 設(shè)置調(diào)度 -->

          <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
          <property name="triggers">
          <list>
          <ref local="cronTrigger" />
          </list>
          </property>
          </bean>  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 岑巩县| 冕宁县| 红桥区| 庆元县| 邻水| 新安县| 青冈县| 东安县| 宣汉县| 抚州市| 栾川县| 安岳县| 修文县| 罗平县| 北宁市| 浦江县| 全州县| 新泰市| 金湖县| 凤阳县| 阿克苏市| 鄂伦春自治旗| 辰溪县| 逊克县| 拉萨市| 安宁市| 牡丹江市| 棋牌| 麟游县| 潮安县| 二连浩特市| 江华| 蒲江县| 察哈| 上饶市| 拜城县| 镶黄旗| 乡城县| 乌兰察布市| 武夷山市| 鄂尔多斯市|