读书人

spring上quartz启动两次的有关问题

发布时间: 2012-08-21 13:00:21 作者: rapoo

spring下quartz启动两次的问题

最近正在做的项目,测试的时候发现定时调度任务会执行两次,于是乎查资料呀,都说是Tomcat配置问题,哥改了还是不行,后来无奈使用了一个网上说的方法,将JOB中的方法使用同步,通过一个静态变量进行控制,配置如下:

?

?

?

JOB如下:

public class OffMailReportJob extends QuartzJobBean { private IIsolationAreaService isolationAreaService;  public IIsolationAreaService getIsolationAreaService() {  return isolationAreaService; } public void setIsolationAreaService(IIsolationAreaService isolationAreaService) {  this.isolationAreaService = isolationAreaService; } private static JLogger log = LoggerFactory.getLogger(OffMailReportJob.class);  static int sendIndexFlag =0;//由doSend修改,其他方法不要修改此参数 public void doSend() {    // 定时器同时调用两次的问题需要查找原因  if (sendIndexFlag > 0)   return;// 保证同一时刻只有一个定时器运行,通过这种方式保证每次定时时间到时,只执行一个线程  sendIndexFlag = 1;// 锁定    try {   isolationAreaService.sendOffMailReport();  } catch (Exception e) {   log.error(e.getMessage(), e);  }    sendIndexFlag = 0;// 锁定解除 } @Override protected void executeInternal(JobExecutionContext arg0)   throws JobExecutionException { }

?

?

?

照此修改时可以解决问题滴

后台又查啊查的,发现问题的根本:

web容器启动的时候,读取applicationContext.xml文件时,会加载一次。
第二次:Spring本身会加载applicationContext.xml一次。
一般来说,我们的quartz配置就是写在applicationContext.xml文件里的。
解决办法很简单
先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml
然后修改web.xml,让web容器启动时,可以加载该文件
这样quartz只会在web容器启动时加载一次,Spring不会再加载了。

读书人网 >软件架构设计

热点推荐