1. 程式人生 > >定時器的實現、java定時器介紹與Spring中定時器的配置

定時器的實現、java定時器介紹與Spring中定時器的配置

1定時器的作用
在實際的開發中,如果專案中需要定時執行或者需要重複執行一定的工作,定時器顯現的尤為重要。
當然如果我們不瞭解定時器就會用執行緒去實現,例如:
package org.lzstone.action
public class FinanceAction extends Thread{
       private Date date;
       public void run{
       try{
       while(true){
       Thread.sleep((int)(Math.random()*1000));
       date = new Date();
       //定時執行任務
       }
       }catch(Exception e){
        e.printStackTrace();
       }
}
}
自己實現定時器的工作很複雜,如果實現不好佔用記憶體過多,系統就此Over,所以處理定時執行或者重複執行的任務,定時器是很好的選擇
2.java中常見的定時器

1)藉助Java.util.Timer來實現
2)OpenSymphony社群提供的Quartz來實現
3.介紹Timer
利用Timer開發定時任務是主要分為兩個步驟:
1)建立定時任務類
示例程式碼:
package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
       public void run(){
              //執行的定時器任務
       }
}
2)執行定時任務,執行定時任務分為兩種方式:
2.1)程式直接啟動
示例程式碼:
package org.lzstone.action
public class LzstoneMain{
       .......
       public void run(){
        //執行定時器的任務
        //建立例項
        Timer timer = new Timer();
        引數:
        new LzstoneTimeTask()- 所要安排的任務。
        0- 執行任務前的延遲時間,單位是毫秒。
        1*1000- 執行各後續任務之間的時間間隔,單位是毫秒。
        timer.schedule(new LzstoneTimeTask(),0,1*1000);
       }
}
2.2)web監聽方式
示例程式碼:
package org.lzstone.action
public class LzstoneMain implements ServletContextListener{
       private Timer timer = null;
       //初始化監聽器,建立例項,執行任務
       public void contextInitialized(ServletContextEvent event){
               timer = new Timer();
               timer.schedule(new LzstoneTimeTask(),0,1*1000);
       }
       //銷燬監聽器,停止執行任務
       public void contextDestroyed(ServletContextEvent event){
              //注意,在此計時器呼叫的計時器任務的 run 方法內呼叫此方法,就可以絕對確保正在執行的任務是此計時器所執行的最後一個任務。
              timer.cancel();
        }
}
web.xml配置
<listener>
   <listener-class>
        org.lzstone.action.LzstoneMain
   </listener-class>
</listener>
4. 介紹Quartz

Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源專案,可以用來建立簡單或者複雜的定時任務,利用Quartz開發定時任務的步驟與Timer類

似。

利用Quartz開發定時任務是主要分為兩個步驟:
1)建立定時任務類
示例程式碼:
package org.lzstone.action
public class LzstoneTimeTask implements Job{
       public void execute(JobExecutionContext context) throws JobExecutionException{
              //執行的定時器任務
       }
}
2)執行定時任務,執行定時任務分為兩種方式:
2.1)程式直接啟動,建立任務排程器及配置相應的任務計劃
示例程式碼:
package org.lzstone.action
public class LzstoneMain{
       private static Scheduler sched;
       public static void run() throws Exception{
              //建立LzstoneTimeTask的定時任務
              JobDetail jobDetail = new JobDetail("lzstoneJob",sched.DEFAULT_GROUP,LzstoneTimeTask.class);
              //目標 建立任務計劃
              CronTrigger trigger = new CronTrigger("lzstoneTrigger","lzstone","0 0 12 * * ?");
              //0 0 12 * * ? 代表每天的中午12點觸發
              sched = new org.quartz.impl.StdSchedulerFactory().getScheduler();
              sched.scheduleJob(jobDetail,trigger);
              sched.start();
       }
       //停止
       public static void stop() throws Exception{
              sched.shutdown();
        }
}
//執行
public class Main{
       .............
       public void run(){
            LzstoneMain.run();
       }
       ............
}
2.2)web監聽方式
示例程式碼:
package org.lzstone.action
public class LzstoneMainListener implements ServletContextListener{
       private Timer timer = null;
       //初始化監聽器,建立例項,執行任務
       public void contextInitialized(ServletContextEvent event){
               LzstoneMain.run();
       }
       //銷燬監聽器,停止執行任務
       public void contextDestroyed(ServletContextEvent event){
              LzstoneMain.stop();
        }
}
web.xml配置
<listener>
   <listener-class>
        org.lzstone.action.LzstoneMainListener
   </listener-class>
</listener>
5.對比

Timer方式實現定時器,原理簡單,實現方便,在執行簡單的任務比較方便,不足之處是無法確定執行時間,並且依賴性比較強,必須繼承指定的類
Quartz方式實現定時器,方便,清晰指定啟動時間,定時引數比較靈活,容易實現比較複雜的定時任務,不足之處是需要實現特定介面,載入其框架
兩種方式各有優缺點,在特定場合可以根據其特點選擇使用。
6.Spring定時任務
Spring定時任務對Timer與Quartz都提供了支援,並且實現步驟基本一樣
首先配置Spring對Timer的支援
1.1 建立定時任務類

package org.lzstone.action
import java.util.TimeTask
public class LzstoneTimeTask extends TimeTask{
       public void run(){
              //執行的定時器任務
       }
}
1.2 註冊定時任務類,配置任務計劃與任務排程器
    在專案的WEB-INF下面建立TimerConfig.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--註冊定時執行任務實體-->
<bean id="lzstoneTimeTask" class="org.lzstone.action.LzstoneTimeTask"/>
<!--註冊定時器資訊-->
<bean id="taskInfo" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!--第一次執行任務前需要等待的時間,這裡設定為3秒-->
<property name="delay">
<value>3000</value>
</property>
<!--設定任務的執行週期 這裡設定為4秒-->
<property name="period">
  <value>4000</value>
</property>
<!--設定具體執行的任務 這裡設定為lzstoneTimeTask-->
<property name="timerTask">
<ref local="lzstoneTimeTask"/>
</property>
</bean>
<!--配置定時器任務的排程器-->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<!--註冊定時器列表-->
<property name="scheduledTimerTasks">
    <list>
        <ref local="taskInfo"/>
        ........
    </list>
</property>
</bean>
</beans>
1.3 web專案中的啟動設定
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/TimerConfig.xml</param-value>
     </context-param>

     <listener>
         <listener-class>
                  org.springframework.web.context.ContextLoaderListener
         </listener-class>
     </listener>
配置Spring對Quartz的支援
2.1 建立定時任務類

package org.lzstone.action
public class LzstoneQuartzTask{
       public void execute(){
              //執行的定時器任務
       }
}
2.2 註冊定時任務類,配置任務計劃與任務排程器
    在專案的WEB-INF下面建立QuartzConfig.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean>
<!--註冊定時執行任務實體-->
<bean id="lzstoneQuartzTask" class="org.lzstone.action.LzstoneQuartzTask"/>
<!--註冊定時器資訊-->
<bean id="taskInfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--指定要執行的定時任務類  這裡是LzstoneQuartzTask-->
<property name="targetObject">
<ref local="lzstoneQuartzTask"/>
</property>
<!--指定定時器任務類要執行的方法名稱 這裡是execute-->
<property name="targetMethod">
<value>execute</value>
</property>
</bean>
<!--配置定時器任務的排程器-->
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!--宣告要執行的實體-->
<property name="jobDetail">
    <ref local="taskInfo"/>
</property>
<!--設定執行時間-->
<property name="cronExpression">
    <value>0 0 12 * * ?</value>
</property>
</bean>
<!--註冊監聽器-->
<bean id="registerQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--註冊定時器實體 集合-->
<property name="triggers">
    <list>
          <ref local="quartzTrigger"/>
    </list>
</property>
</bean>
</beans>
2.3 web專案中的啟動設定
    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/QuartzConfig.xml</param-value>
     </context-param>

     <listener>
         <listener-class>
                  org.springframework.web.context.ContextLoaderListener
         </listener-class>
     </listener>