ann
          冰是沒有未來的,因為它的永恒
          posts - 107,comments - 34,trackbacks - 0
          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿

          隨筆分類(105)

          隨筆檔案(97)

          文章分類(16)

          文章檔案(20)

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          一.Quartz介紹
               Quartz是一個作業(yè)調(diào)度系統(tǒng)(a job scheduling system),負責(zé)在約定的時間到達時執(zhí)行(或通知)其他軟件控制。是一個Java的定時任務(wù)框架,使用它可以方便的實現(xiàn)計劃任務(wù),即在某個時間或每隔一定時間運行一個任務(wù)。Quartz的核心是Job/JobDetail,Trigger和Scheduler。

              1.Job/JobDetail
                 Job/JobDetail=既要執(zhí)行的任務(wù),可以通過實現(xiàn)Job(interface)中的excute方法來指定任務(wù)的具體操作。 他描述了一個任務(wù)具體的信息,比如名稱,組名等等。JobDetail對象是在Quartz的客戶端(我們的程序)在Job被關(guān)聯(lián)加入到Scheduler時創(chuàng)建的,JobDetail包含了Job的各種屬性值和   JobDataMap,JobDataMap中存放了與之相關(guān)的Job類實例的狀態(tài)信息。

              2.Trigger
                 用于控制一組Job的觸發(fā),包裹SimmperTrigger和CronTrigger,后者支持一種描述觸發(fā)事件和間隔的表達式語言。Quartz有個很好的想法就是分離了任務(wù)和任務(wù)執(zhí)行的條件。Trigger就是控制任務(wù)執(zhí)行條件的類,當(dāng)Trigger認為執(zhí)行條件滿足的時刻,Trigger會通知相關(guān)的Job去執(zhí)行。分離的好處是:
                      1).你可以為某個Job關(guān)聯(lián)多個Trigger,其中任何一個條件滿足都可以觸發(fā)job執(zhí)行,這樣可以完成一些組合的高級觸發(fā)條件
                      2).當(dāng)Trigger失效后(比如:一個永遠都不能滿足的條件),你不必去聲明一個新的job,代替的是你可以為job關(guān)聯(lián)一個新的Trigger讓job可以繼續(xù)執(zhí)行。
            
              3.Scheduler是控制和管理觸發(fā)器的啟動和終止。
                 使用Scheduler前必須實例化Scheduler,需要由SchedulerFactory類來創(chuàng)建Scheduler,Factory的實例可以通過在JNDI存儲中的Factory的序列化的方式獲取,實例化Factory后直接使用該實例很容易。如下:
                 public class WangyouQuartzListener extends QuartzInitializerListener {
                      public  static  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

                      public WangyouQuartzListener() {
                                 super();
                      }

                     public void contextInitialized(ServletContextEvent event) {
                              super.contextInitialized(event);
                              String factoryKey = event.getServletContext().getInitParameter("servlet-context-factory-key");
                               if (factoryKey == null) {
                                         factoryKey = QUARTZ_FACTORY_KEY;
                                }
                                StdSchedulerFactory factory = (StdSchedulerFactory) event.getServletContext().getAttribute(factoryKey);

                             try {
                                   QuartzScheduleHolder.getInstance().setScheduler(factory.getScheduler());
                                 //per 2 hours add friends
                                 Trigger trigger =  TriggerUtils.makeHourlyTrigger(24);
                                 //Trigger trigger =  TriggerUtils.makeSecondlyTrigger(60);
                                 trigger.setName(AddNewUserFriendJobDetail.JOB_NAME);
                                trigger.setStartTime(this.getBeforeAfterDate(1,-13));
                                QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new AddNewUserFriendJobDetail(),trigger);
                                //把job和Trigger關(guān)聯(lián),這樣當(dāng)Trigger認為應(yīng)該觸發(fā)的時候就會調(diào)用(實際上是Scheduler調(diào)用)job.execute方法了。

                                //per 3 day send mail and leave message
                                Trigger trigger2 =  TriggerUtils.makeHourlyTrigger(24*3);
                                trigger2.setStartTime(this.getBeforeAfterDate(1,-12));
                                trigger2.setName(LeaveMessageNewUserJobDetail.JOB_NAME);
                                QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new LeaveMessageNewUserJobDetail(),trigger2);

                                 // per 6  recommend video
                                Trigger trigger3 =  TriggerUtils.makeHourlyTrigger(24*7);
                                trigger3.setName(RecommendVideoNewUserJobDetail.JOB_NAME);
                                trigger3.setStartTime(this.getBeforeAfterDate(2,-11));
                                QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new RecommendVideoNewUserJobDetail(),trigger3);

                     
                                   QuartzScheduleHolder.getInstance().getScheduler().start();
                             } catch (Exception e) {
                                  e.printStackTrace();
                             }
                        }

                       public void contextDestroyed(ServletContextEvent event) {
                             super.contextDestroyed(event);
                               QuartzScheduleHolder.getInstance().setScheduler(null);
                       }

                        private Date getBeforeAfterDate( int day,int hour){
                                 Calendar   cal   =   Calendar.getInstance();
                                cal.add(Calendar.DATE,day);
                               cal.add(Calendar.HOUR,hour);
                               return cal.getTime();
                       }
                     }
          二。Spring Quartz
                Spring的scheduling。quartz包中對Quartz的框架進行封裝,使得開發(fā)時不用寫任何Quartz和Spring的代碼就可以實現(xiàn)定時任務(wù)。Spring通過JobDetailBean,MethodInvokingJobDetailFactoryBean實現(xiàn)Job的定義,后者更加使用,只需指定要運行的類,和該類中運行的方法即可,Spring將自動生成符合Quartz要求的JobDetail。例如:
                1.jobDetail
                   public class SayHelloJob {
             
                             private static  DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                             private String message;

                             public String getMessage() {
                                     return message;
                            }

                            public void setMessage(String message) {
                                      this.message = message;
                           }

                           public void sayHello(){
                                    Date date = new Date();
                                   System.out.println(dateFormat.format(date)+" :"+this.getMessage() );
                           }
                    }
                 2.spring的配置文件:quartzbean.xml
                     <?xml version="1.0" encoding="UTF-8"?>

                     <beans xmlns="http://www.springframework.org/schema/beans"
                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
                              xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

                              <bean name="sayHelloJob" class="com.fg114.takeout.job.SayHelloJob">
                                        <property name="message" value="start .............." />
                             </bean>

                             <bean name="sayHelloDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
                                        <property name="targetObject" ref="sayHelloJob" />
                                       <property name="targetMethod" value="sayHello"/>
                              </bean>

                             <bean name="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
                                            <!--這里定義定時任務(wù)的對象的位置-->
                                      <property name="jobDetail" ref="sayHelloDetailBean"/>
                                     <!--這里定義每六秒鐘程序執(zhí)行一次-->
                                       <property name=""></property>
                                      <property name="repeatInterval" value="6000"/>
                                     <!--這里定義程序啟動兩秒鐘后開始執(zhí)行-->
                                   <property name="startDelay" value="2000"/>
                              </bean>
                           <! --          啟動任務(wù)    -->
                             <bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
                                   <property name="triggers">
                                       <list>
                                            <ref bean="simpleTriggerBean"/>
                                      </list>
                                 </property>
                            </bean>
                       </beans>
          3.web.xml :
                      加入
                     <listener>
                       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                     </listener>
                 注意:common-collections.jar 版本布不能是2.1版本的



                   

               
          posted on 2009-03-23 10:56 冰是沒有未來的,因為它的永恒 閱讀(2435) 評論(0)  編輯  收藏 所屬分類: java

          當(dāng)下,把心放下 放下如果是可能的,那一定是在當(dāng)下,
          不在過去,也不在未來。
          當(dāng)下放下。唯有活在當(dāng)下,你的問題才能放下。

          主站蜘蛛池模板: 葵青区| 林周县| 瑞安市| 江源县| 静海县| 兰考县| 邯郸市| 涿鹿县| 紫金县| 南漳县| 陆良县| 揭阳市| 酒泉市| 永仁县| 宜都市| 淄博市| 报价| 留坝县| 屯昌县| 凤山县| 洪泽县| 威信县| 榆树市| 加查县| 溧阳市| 乃东县| 界首市| 江安县| 永定县| 镇康县| 邯郸县| 东山县| 石棉县| 平罗县| 花莲市| 玛纳斯县| 吐鲁番市| 东宁县| 庆安县| 广宗县| 东乌珠穆沁旗|