1.需求说明
主要负责项目任务调度。使用Quartz。以Spring为辅助。
如今有这样一个需求:我们不知道管理员想设定过多厂时间运行主任务,须要在配置文件定义。在配置好后须要马上运行。实现热部署。
2.设计
在主调度加一个方法,此方法先检測配置文件是否更改。若更改则将调度时间又一次设置,又一次启用调度任务
3.实现
在PropertiesUtil定义一一个初始时间,改时间在这个类初始化之前运行。也就是在静态代码块运行,代码例如以下:
private static long curModifiedTime; static { try { curModifiedTime = new File(filePath).lastModified(); System.out.println("当前文件改动时间为 " +curModifiedTime); } catch (Exception e) { e.printStackTrace(); } }
此时获取到文件本来的时间
写一个方法来推断配置文件是否改动:
public static boolean isModifiedValue() { boolean flag = false; long lastModifiedTime = new File(filePath).lastModified(); if(lastModifiedTime > curModifiedTime) { curModifiedTime= lastModifiedTime; flag = true; } return flag; }
读取文件最后改动地址。若大于初始时间。则将最后改动时间赋给初始时间
public boolean reSetTaskSchedulerzIntervalTime(){ boolean flag = false; //监听到配置文件改动 if(PropertiesUtil.isModifiedValue()) { long time = 0L; try { time = Integer.parseInt(PropertiesUtil.readValue(TaskSchedulerzIntervalTime)); simpleTrigger.setRepeatInterval(time); Scheduler scheduler = quartzScheduler.getScheduler(); String jobName = simpleTrigger.getName(); String group = simpleTrigger.getGroup(); try { scheduler.pauseJob(jobName, group); scheduler.unscheduleJob(jobName,group); scheduler.scheduleJob(simpleTrigger); scheduler.resumeJob(jobName, group); flag = true; } catch (SchedulerException e1) { e1.printStackTrace(); } } catch (NumberFormatException e) { System.out.println("定时任务非数字!"); e.printStackTrace(); } } return flag; }
当中,quartzScheduler和simpleTrigger是注入进去的,在Spring中整合Quartz时已经定义好,配置文件例如以下
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> </list> </property> <property name="configLocation" value="classpath:quartz.properties" /> </bean> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail"> <ref bean="jobDetail" /> </property> <property name="startDelay"> <value>0</value> </property> <property name="repeatInterval" value="${taskSchedulerzIntervalTime}" /> </bean> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="taskScheduler" /> <property name="targetMethod" value="run" /> </bean>
之前的调度时间是在里面写死的。如今是通过配置文件来读取。例如以下
<context:property-placeholder location="classpath:config.properties,classpath:jdbc.properties" />
測试例如以下