SSH框架,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 id="runkQuartz" class="com.idazui.lobby.quartz.runkQuartz">
        <property name="daoRepo">
            <ref bean="daoRepo"/>
        </property>
    </bean>
   <!--  注冊定時器信息  --> 
    <bean id="taskInfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
 <!-- 防止定時任務沖突執行,延遲作用 -->   
    <property name="concurrent" value="false" />
   <!--   指定要執行的定時任務類  這里是runkQuartz  --> 
    <property name="targetObject">  
    <ref local="runkQuartz"/>  
    </property>  
    <!--  指定定時器任務類要執行的方法名稱 這里是execute   --> 
    <property name="targetMethod">  
    <value>run</value>  
    </property>  
    </bean>    
  <!-- 配置定時器任務的調度器    -->   
    <bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <!-- 聲明要運行的實體   -->  
    <property name="jobDetail">  
        <ref bean="taskInfo"/>  
    </property>  
    <!-- 設置運行時間   -->  
    <property name="cronExpression">  
    <!--  每天零點--> 
       <value>0 0 0 * * ?</value> 
   <!--  每1分鍾執行一次-->   
    <!--  <value>0 */1 * * * ?</value>   -->
    </property>  
    </bean>  
   <!-- 周定時器 -->   
    <bean id="weekRunkQuartz" class="com.idazui.lobby.quartz.weekRunkQuartz">
        <property name="daoRepo">
            <ref bean="daoRepo"/>
        </property>
    </bean>
     <bean id="weekinfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
     <!-- 防止定時任務沖突執行,延遲作用 --> 
    <property name="concurrent" value="false" />
     <!-- 指定要執行的定時任務類  這里是runkQuartz   --> 
    <property name="targetObject">  
    <ref local="weekRunkQuartz"/>  
    </property>  
     <!-- 指定定時器任務類要執行的方法名稱 這里是execute    -->
    <property name="targetMethod">  
    <value>run</value>  
    </property>  
    </bean>  
 <bean id="weekrunk" class="org.springframework.scheduling.quartz.CronTriggerBean">  
          <!--  聲明要運行的實體  -->    
    <property name="jobDetail">  
        <ref bean="weekinfo"/>  
    </property>  
         <!-- 設置運行時間   --> 
     <property name="cronExpression">  
           <!--  每周日零點 -->  
             <!-- <value>*/5 * * * * ?</value> -->
               <value>0 0 0 ? * MON</value>
               <!-- <value>0 0 0 ? * WED *</value>  -->
              <!--  <value>0 59 23 ? * WED</value> -->
    </property>  
    </bean>    
            <!-- 月定時器 -->  
    <bean id="monthRunkQuartz" class="com.idazui.lobby.quartz.monthRunkQuartz">
        <property name="daoRepo">
            <ref bean="daoRepo"/>
        </property>
    </bean>
     <bean id="monthinfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
     <!-- 防止定時任務沖突執行,延遲作用 --> 
    <property name="concurrent" value="false" />
     <!-- 指定要執行的定時任務類  這里是runkQuartz   --> 
    <property name="targetObject">  
    <ref bean="monthRunkQuartz"/>  
    </property>  
    <!--  指定定時器任務類要執行的方法名稱 這里是execute   --> 
    <property name="targetMethod">  
    <value>run</value>  
    </property>  
    </bean>  
     <bean id="monthrunk" class="org.springframework.scheduling.quartz.CronTriggerBean">  
     <!-- 聲明要運行的實體   --> 
    <property name="jobDetail">  
        <ref bean="monthinfo"/>  
    </property>  
           <!--  設置運行時間  -->
           <property name="cronExpression">  
     <!--  相當於每月第一天零點--> 
     <!--  <value>0 0 0 L * ? *</value> -->
     <!-- 每月最后一天23:59 -->
     <!-- <value>0 59 23 L * ?</value> -->
     <!-- 每月一號零點 -->
     <value>0 0 0 1 * ?</value>
    </property>  
    </bean> 
    <!-- 心跳監聽定時器 -->  
    <bean id="tokenQuartz" class="com.idazui.lobby.quartz.validUserToken">
        <property name="daoRepo">
            <ref bean="daoRepo"/>
        </property>
    </bean>
     <bean id="tokeninfo" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
     <!-- 防止定時任務沖突執行,延遲作用 --> 
    <property name="concurrent" value="false" />
     <!-- 指定要執行的定時任務類  這里是runkQuartz   --> 
    <property name="targetObject">  
    <ref bean="tokenQuartz"/>  
    </property>  
    <!--  指定定時器任務類要執行的方法名稱 這里是execute   --> 
    <property name="targetMethod">  
    <value>run</value>  
    </property>  
    </bean>  
     <bean id="tokenrunk" class="org.springframework.scheduling.quartz.CronTriggerBean">  
     <!-- 聲明要運行的實體   --> 
    <property name="jobDetail">  
        <ref bean="tokeninfo"/>  
    </property>  
           <!--  設置運行時間  -->
           <property name="cronExpression">  
     <!-- 每10秒執行一次--> 
     <value>0/10 * * * * ?</value>
    </property>  
    </bean> 
    
    <!-- 這個類用來做需要完成的業務-->  
    <bean id="doAutoPush" class="com.idazui.lobby.service.DoAutoPush">
    <property name="daoRepo">
            <ref bean="daoRepo"/>
        </property>
    </bean>  
    <!-- 定時任務 -->  
    <!-- 定義調用對象和調用對象的方法,這個配置和普通的一樣的 -->  
    <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
        <!-- 調用的類  -->  
        <property name="targetObject">  
            <ref bean="doAutoPush" />  
        </property>  
        <!-- 調用類中的方法  -->  
        <property name="targetMethod">  
            <value>autoPush</value>  
        </property>   
        <property  name ="concurrent"  value ="false"   />          
    </bean>  
    <!-- 定義觸發時間 ,這邊就不同了,這里必須將時間設置成無限長,因為我們要去讀取數據庫的時間來做為定時器的觸發時間-->  
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
        <property name="jobDetail">  
            <ref bean="jobtask" />  
        </property>  
        <!-- cron表達式  -->  
        <property name="cronExpression">  
            <!-- cron將時間設置成無限長  -->  
            <value>1 0 0 1 1 ? 2099</value>  
        </property>  
    </bean>  
    
   <!--  注冊監聽器   -->  
    <bean id="registerQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <!--  注冊定時器實體 集合  -->  
    <property name="triggers">  
        <list>  
              <ref bean="quartzTrigger"/>   
               <ref bean="weekrunk"/>  
                 <ref bean="monthrunk"/> 
                <ref bean="tokenrunk"/>  
                <ref bean="cronTrigger"/> 
        </list>  
    </property>  
    </bean>   
   
          <!--這里就是這里,就這個配置搞了我一天,這個類是用來設置觸發時間的,調用這個類的init的方法來進行對時間的配置--> 
           <!--這個對象一定要注入,這樣類才能進行管理,還有在類型要用get set方法,不然會報錯。  
            <property name="scheduler" ref="registerQuartz" />    -->  
   <bean id="pushServiceImpl" class="com.idazui.lobby.service.DoAutoPushServiceImpl" lazy-init="false" init-method="init">   
            <property name="scheduler" ref="registerQuartz" />  
    </bean>    
    </beans>  
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.text.ParseException;

import org.apache.log4j.Logger;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.stereotype.Service;


/** 
 * 功能說明:設置下發定時時間service接口實現類 
 *  
 * 創建人:wyb
 *  
 * 
 */  
public class DoAutoPushServiceImpl{  
    protected Logger log = Logger.getLogger(getClass().getName());
    
     //這個是總管理類  
    private Scheduler scheduler;  
      
    public void init(){  
          
        try {  
                                  
            CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger("cronTrigger",                         Scheduler.DEFAULT_GROUP);  
            String originConExpression = trigger.getCronExpression();  
            //以下幾行用來測試時間用
           /* Date date=new Date();
               SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
               SimpleDateFormat rf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               String str = "17:03:00";  
               String str2=df.format(date);
               System.out.println(str2);
               String bb=str2+" "+str;
                Date shijian = rf.parse(bb);*/
            //從fan()方法獲取規定時間段內的隨機時間
            Date shijian=fan();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
            String strDate = format.format(shijian).substring(11, 19);  
            //因為是要每天做一次定時任務,所以我截取了字符串進行了拼接格式  
                           String[] strTime = strDate.split(":");  
            String pushTime =  strTime[2]+" "+strTime[1]+" "+strTime[0]+" * * ? ";  
            //以下就是重新對時間的設置,這樣就可以達到動態設置效果。  
            trigger.setCronExpression(pushTime);  
            scheduler.rescheduleJob("cronTrigger", Scheduler.DEFAULT_GROUP, trigger);  
        } catch (SchedulerException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (ParseException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
  
  
  
  
   /* private String getCronExceptionDB() throws ParseException{  
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            long timeNow= System.currentTimeMillis()/1000;
            long timeLose=(System.currentTimeMillis()+2*60*60*1000)/1000;
            //long timeLose=System.currentTimeMillis()+2*60*60*1000;
            System.out.println(timeNow+"  "+timeLose);                                               
            String dateNow=sdf.format(new Date((timeNow)*1000));
            Date shijian=fan();
            String ti=getCron(shijian);
            return ti;
        }*/
        /*** 
         *  
         * @param date 
         * @param dateFormat : e.g:yyyy-MM-dd HH:mm:ss 
         * @return 
         */  
        public static String formatDateByPattern(Date date,String dateFormat){  
            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);  
            String formatTimeStr = null;  
            if (date != null) {  
                formatTimeStr = sdf.format(date);  
            }  
            return formatTimeStr;  
        }  
        /*** 
         * convert Date to cron ,eg.  "0 06 10 15 1 ? 2014" 
         * @param date  : 時間點 
         * @return 
         */  
        public  String getCron(java.util.Date  date){  
            String dateFormat="ss mm HH dd MM ? yyyy";  
            return formatDateByPattern(date, dateFormat);  
        }  
        public Date fan() throws ParseException{
           /* Date date=new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat rf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String str = "06:00:00";  
            String str2=df.format(date);
            System.out.println(str2);
            String bb=str2+" "+str;
             Date today = rf.parse(bb);  */
            log.debug("進入隨機時間方法");
            Date today=timec();
               log.debug("時間格式:"+today);
           return today;
       }
        public  Date timec() throws ParseException{
            Date date=new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
               SimpleDateFormat rf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              //時間段開始
               String str = "06:00:00";  
               String str2=df.format(date);
            String bb=str2+" "+str;
            Date one=rf.parse(bb);
            long timeone=(one.getTime())/1000;
       /*     System.out.println(timeone);
            System.out.println((timeone)/1000);*/
            //時間段結束
            String strone = "12:00:00";  
               String strtwo=df.format(date);
            String two=strtwo+" "+strone;
            Date newdate=rf.parse(two);
            long timetwo=(newdate.getTime())/1000;
           /* System.out.println(timetwo);
            System.out.println((timetwo)/1000);*/
            Random ra=new Random();
            int onenum=(int)timetwo;
            int twonum=(int)timeone;
            int three=onenum-twonum;
           /* System.out.println(onenum+"  **");
            System.out.println(twonum+"  ^^");*/
           int result=ra.nextInt(three)+twonum;
               //System.out.println(result);
               Date ndate=new Date((result)*1000L);
               log.debug("最終獲取時間為:"+ndate);
        return ndate;     
        }
        public Scheduler getScheduler() {  
            return scheduler;  
        }  
      
        public void setScheduler(Scheduler scheduler) {  
            this.scheduler = scheduler;  
        }  
 
}  

 

import java.io.File;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;


public class DoAutoPush {
    private static Logger m_logger = Logger.getLogger(DoAutoPush.class);
    private DaoRepo daoRepo;
    public DaoRepo getDaoRepo() {
        return daoRepo;
    }
    public void setDaoRepo(DaoRepo daoRepo) {
        this.daoRepo = daoRepo;
    }
    public void autoPush(){
        System.out.println("成功了");
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM