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" />
测试如下