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