前文:http://www.cnblogs.com/LiuChunfu/p/5598806.html 提到了一种动态修改定时器的方法,
其本质就是在job方法中注入Schedular的对象,从Schedular中获取Trigger(触发器),然后修改触发器的条件,重新启动。
前文中的方法,其实已经涉及到了循环调用。
Job类 => Job => Trigger => Schedular =>Job类。
这样是很容易发生问题的,也确实在实际项目中发生了问题,特别是当Schedular中有多个trigger的时候,注入实际的Job工作类时候报错了,产生的原因应该就是因为循环调用的问题。
方法2:
既然我们已经通过在Srping的Bean的XML文件中配置了SchedulerFactory产生的Bean,那么完全可以在实际的Job中通过@Resource或者@Autowired注入,再仔细一思考,仍然不对啊,这个和方法一的循环调用一样,会出现问题(实际也是)。
此时处理办法是:懒加载Schdular的类,用到的时候才加载。
代码如下:
Java代码:
public class TestJob { @Autowired private TestService testSevice; public void doSomething() { testSevice.sayHi(); System.err.println("****:" + TimeUtils.getCurrentTime()); } @Autowired @Qualifier("scheduler") @Lazy private Scheduler scheduler; /** * 重置定时任务 * @Title: restJob * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param time * @param @throws Exception * @return void 返回类型 * @throws */ public void restJob(long time) throws Exception { TriggerKey triggerKey = new TriggerKey("testTrigger", Scheduler.DEFAULT_GROUP); SimpleTriggerImpl simpleTrigger = (SimpleTriggerImpl) scheduler.getTrigger(triggerKey); simpleTrigger.setRepeatInterval(time); scheduler.rescheduleJob(triggerKey, simpleTrigger); }}