修改Spring-task 定时时间
2015-10-20 17:57
627 查看
spring-task是一个轻量级定时器,且spring并没有提供定时的动态修改接口。
我们需要做的只是
1. 找到task注册服务类ScheduledTaskRegistrar
2. 在ScheduledTaskRegistrar 中找到想要需改的 TaskScheduler
3. TaskScheduler 中 引用的beanName就是定时启动时调用的SpringBean
`
以上会将两个定时器fund_common_Scheduler1,fund_common_Scheduler2查到。
接下来,修改定时内容
需要做的,就是从众多被管理的定时任务中,找到需要修改的内容任务。
使用方法如下
我们需要做的只是
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("修改定时时间失败"); } }
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- java基本教程之线程休眠 java多线程教程
- JSP开发中在spring mvc项目中实现登录账号单浏览器登录
- spring boot实战之内嵌容器tomcat配置
- 基于Spring框架的Shiro配置方法
- Spring MVC中上传文件实例
- spring aop两种配置方式
- 实例讲解Java的Spring框架中的AOP实现
- 解析Java中如何获取Spring中配置的bean
- Spring的注解配置与XML配置之间的比较