JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
          在Spring中,使用JDK的Timer類庫來做任務調度功能不是很方便,關鍵它不可以象cron服務那樣可以指定具體年、月、日、時和分的時間。你只能將時間通過換算成微秒后傳給它。如任務是每天執行一次,則需要在spring中如下配置:
          ­
          <bean id="scheduledTask" class= "org.springframework.scheduling.timer.ScheduledTimerTask">
          <!--程序啟動后開始執行任務的延遲時間 -->
          <property name="delay" value="0" />
          <!--每隔一天【一天=24×60×60×1000微秒】執行一次-->
          <property name="period" value="86400000" />
          <!--業務統計報表bean -->
          <property name="timerTask" ref="businessReport" />
          </bean>
          ­
          其中period就是一天的微秒數。如果每月1日運行一次,那就復雜了,不知如何配置。因為月份有大、小月之分,每月的微秒數都不一樣。
          ­
          而Quartz類庫不但有著上述JDK的Timer類庫類似的配置,更重要的,它還有著類似于unix的cron服務的配置。因此,在遷移中我們采用了Quartz類庫的接口。

          具體的步驟如下:
          1 編寫業務類,該類繼承了org.quartz.Job,主要的邏輯在execute方法中編寫

          2 配置spring的applicationContext.xml文件
              2.1 配置任務JobDetailBean
              2.2配置觸發器 CronTriggerBean
              2.3配置調度器  SchedulerFactoryBean

          3 所需要的jar包:
                   spring.jar,quartz.jar,commons-logging-1.0.4.jar,commons-dbcp-1.2.2.jar,commons-pool-1.3.jar

          4 把quartz.properties放到類路徑下

          以下為一個demo

          業務類:

          Java代碼

           

          package task;   
            
          import java.util.Date;   
            
          import org.quartz.JobExecutionContext;   
          import org.quartz.JobExecutionException;   
            
          public class BusinessReport implements org.quartz.Job{   
                
          public void perform()//執行報表統計入口函數   
                      
          //業務邏輯   
                    System.out.println("開始執行報表的業務邏輯了----現在的時間是--"+new Date());   
                       
                  }
             
            
              
          public void execute(JobExecutionContext arg0) throws JobExecutionException {   
                  perform();   
                     
              }
             
            
          }
             

          applicationContext.xml文件

           三 quartz.properties文件的內容(默認放在類路徑下)
          #============================================================================
          # Configure Main Scheduler Properties 
          #============================================================================
          org.quartz.scheduler.instanceName = DefaultQuartzScheduler
          org.quartz.scheduler.instanceId = AUTO
          org.quartz.scheduler.rmi.export = false
          org.quartz.scheduler.rmi.proxy = false
          org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

          #============================================================================
          # Configure ThreadPool 
          #============================================================================
          #org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
          org.quartz.threadPool.threadCount = 10
          org.quartz.threadPool.threadPriority = 5
          #org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

          #============================================================================
          # Configure JobStore 
          #============================================================================
          #org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
          #org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
          org.quartz.jobStore.misfireThreshold = 60000
          #org.quartz.jobStore.useProperties = false
          #org.quartz.jobStore.tablePrefix = QRTZ_
          #org.quartz.jobStore.dataSource = myDS

          #org.quartz.jobStore.isClustered = true
          #org.quartz.jobStore.clusterCheckinInterval = 15000

          #============================================================================
          # Configure DataSource
          #============================================================================
          org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
          org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/test
          org.quartz.dataSource.myDS.user = root
          org.quartz.dataSource.myDS.password = root
          org.quartz.dataSource.myDS.maxConnections = 10


          附:cronExpression表達式解釋:
          0 0 12 * * ?---------------在每天中午12:00觸發
          0 15 10 ? * *---------------每天上午10:15 觸發
          0 15 10 * * ?---------------每天上午10:15 觸發
          0 15 10 * * ? *---------------每天上午10:15 觸發
          0 15 10 * * ? 2005---------------在2005年中的每天上午10:15 觸發
          0 * 14 * * ?---------------每天在下午2:00至2:59之間每分鐘觸發一次
          0 0/5 14 * * ?---------------每天在下午2:00至2:59之間每5分鐘觸發一次
          0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之間的每5分鐘觸發一次
          0 0-5 14 * * ?---------------每天在下午2:00至2:05之間每分鐘觸發一次
          0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和2:44時觸發
          0 15 10 ? * MON-FRI---------------從星期一至星期五的每天上午10:15觸發
          0 15 10 15 * ?---------------在每個月的每15天的上午10:15觸發
          0 15 10 L * ?---------------在每個月的最后一天的上午10:15觸發
          0 15 10 ? * 6L---------------在每個月的最后一個星期五的上午10:15觸發
          0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的每個月的最后一個星期五的上午10:15觸發
          0 15 10 ? * 6#3---------------在每個月的第三個星期五的上午10:15觸發
          0 0 12 1/5 * ?---------------從每月的第一天起每過5天的中午12:00時觸發
          0 11 11 11 11 ?---------------在每個11月11日的上午11:11時觸發.­



          Cron 表達式包括以下 7 個字段:

            ·秒

            ·分

            ·小時

            ·月內日期

            ·月

            ·周內日期

            ·年(可選字段)

            Cron 觸發器利用一系列特殊字符,如下所示:

            ·反斜線(/)字符表示增量值。例如,在秒字段中“5/15”代表從第 5 秒開始,每 15 秒一次。

            ·問號(?)字符和字母 L 字符只有在月內日期和周內日期字段中可用。問號表示這個字段不包含具體值。所以,如果指定月內日期,可以在周內日期字段中插入“?”,表示周內日期值無關緊要。字母 L 字符是 last 的縮寫。放在月內日期字段中,表示安排在當月最后一天執行。在周內日期字段中,如果“L”單獨存在,就等于“7”,否則代表當月內周內日期的最后一個實例。所以“0L”表示安排在當月的最后一個星期日執行。

            ·在月內日期字段中的字母(W)字符把執行安排在最靠近指定值的工作日。把“1W”放在月內日期字段中,表示把執行安排在當月的第一個工作日內。

            ·井號(#)字符為給定月份指定具體的工作日實例。把“MON#2”放在周內日期字段中,表示把任務安排在當月的第二個星期一。

            ·星號(*)字符是通配字符,表示該字段可以接受任何可能的值。

          posted on 2010-07-14 10:03 rogerfan 閱讀(824) 評論(1)  編輯  收藏 所屬分類: 【開源技術】

          Feedback

          # re: 【轉】spring定時任務之quartz 2014-11-25 12:15 zuidaima
          java quartz定時任務demo教程源代碼下載:http://zuidaima.com/share_topic/k%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6-p1-s1.htm  回復  更多評論
            

          主站蜘蛛池模板: 达日县| 南漳县| 繁峙县| 左权县| 新竹市| 剑阁县| 吉安县| 枣阳市| 井陉县| 辽阳市| 吴川市| 文昌市| 庆阳市| 元谋县| 罗城| 富川| 马关县| 隆尧县| 乡宁县| 普兰县| 合山市| 嫩江县| 太仆寺旗| 乐业县| 合肥市| 西贡区| 临沧市| 鄂托克旗| 昌吉市| 伊川县| 奎屯市| 安徽省| 揭阳市| 司法| 常州市| 桂林市| 昂仁县| 中卫市| 大兴区| 吐鲁番市| 车致|