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("成功了"); } }
JAVA修炼塔,技术世界的探知与交流,欢迎你的加入-----群号:535296702

浙公网安备 33010602011771号