您的位置:首页 > 编程语言 > Java开发

修改Spring-task 定时时间

2015-10-20 17:57 627 查看
spring-task是一个轻量级定时器,且spring并没有提供定时的动态修改接口。

我们需要做的只是

1. 找到task注册服务类ScheduledTaskRegistrar

2. 在ScheduledTaskRegistrar 中找到想要需改的 TaskScheduler

3. TaskScheduler 中 引用的beanName就是定时启动时调用的SpringBean

`

Map<String, ScheduledTaskRegistrar>  scheduledTaskRegistrat_map = applicationContext.getBeansOfType(ScheduledTaskRegistrar.class);


以上会将两个定时器fund_common_Scheduler1,fund_common_Scheduler2查到。

private ScheduledTaskRegistrar findScheduledTaskRegistrarInMap(Map<String, ScheduledTaskRegistrar> scheduledTaskRegistrat_map, String taskScheduler_beanName) {
// 启动定时
// 现在好到所有的定时器
for(Map.Entry<String, ScheduledTaskRegistrar> entry : scheduledTaskRegistrat_map.entrySet()) {
ScheduledTaskRegistrar scheduledTaskRegistrar_tmp = entry.getValue();
TaskScheduler taskScheduler = scheduledTaskRegistrar_tmp.getScheduler();
try {
if (taskScheduler instanceof ExecutorConfigurationSupport) {
Field beanName_field = ExecutorConfigurationSupport.class.getDeclaredField("beanName");
ReflectionUtils.makeAccessible(beanName_field);
String beanName = (String)ReflectionUtils.getField(beanName_field, taskScheduler);
if (taskScheduler_beanName.equals(beanName)) {
return scheduledTaskRegistrar_tmp;
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}


接下来,修改定时内容

需要做的,就是从众多被管理的定时任务中,找到需要修改的内容任务。

private boolean modifycheduledTaskRegistrar(ScheduledTaskRegistrar taskScheduledTaskRegistrar,Class refClass,String cron) throws NoSuchMethodException, SecurityException, NoSuchFieldException {
if (!taskScheduledTaskRegistrar.hasTasks()) {
return false;
}

// 所有已经管理起来的定时器取出来
Field scheduledFutures_field = ScheduledTaskRegistrar.class.getDeclaredField("scheduledFutures");
ReflectionUtils.makeAccessible(scheduledFutures_field);
Set<ScheduledFuture<?>> scheduledFutures_set =  (Set<ScheduledFuture<?>>) ReflectionUtils.getField(scheduledFutures_field, taskScheduledTaskRegistrar);

for (ScheduledFuture<?> sf : scheduledFutures_set){

try {
Field delegate_field = DelegatingErrorHandlingRunnable.class.getDeclaredField("delegate");
ReflectionUtils.makeAccessible(delegate_field);

ScheduledMethodRunnable runable = (ScheduledMethodRunnable) ReflectionUtils.getField(delegate_field, sf);
Field target_file = runable.getClass().getDeclaredField("target");
ReflectionUtils.makeAccessible(target_file);

// 同一个定时器的引用类相同,则可确定是同一个定时任务
if (!ReflectionUtils.getField(target_file, runable).getClass().equals(refClass)) {
continue;
}

Field trigger_field = sf.getClass().getDeclaredField("trigger");
ReflectionUtils.makeAccessible(trigger_field);

CronTrigger trigger = (CronTrigger) ReflectionUtils.getField(trigger_field, sf);
Field sequenceGenerator_field = trigger.getClass().getDeclaredField("sequenceGenerator");
ReflectionUtils.makeAccessible(sequenceGenerator_field);
ReflectionUtils.setField(sequenceGenerator_field, trigger, new CronSequenceGenerator(cron, TimeZone.getDefault()));
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
return false;
}


使用方法如下

scheduledTaskRegistrar_right = findScheduledTaskRegistrarInMap(scheduledTaskRegistrat_map, "fund_common_Scheduler2");
if (scheduledTaskRegistrar_right != null) {
try {
if (!modifycheduledTaskRegistrar(scheduledTaskRegistrar_right, xxx.xxx.xxx.class, "1/3 * * * * ?")){
logger.info("修改定时时间失败");
}
} catch (Exception e) {
logger.info("修改定时时间失败");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring task-线程