<?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("成功了"); } }