在SSH框架下使用基于配置的Spring3的调度任务每次执行2次的问题
2012-07-20 15:14
686 查看
近日,在项目中使用Strtus1.2+Spring 3.0.6+Hibernate 3.3.2,搭建一个小业务系统,有定时执行某些任务的需要,并且涉及到数据库操作,不经意间发现spring3.0新增了一个内置的调度任务,使用方式与quartz类似,而且功能也差不多,所以尝试着使用此功能。
刚开始,使用间隔的形式,每次任务都执行2次,一开始以为是这个间隔不是很精确造成的,后来在上线前的测试中发现,要求每周一凌晨3点执行的任务,结果一下执行2次,导致很多重复数据。
不断调整cron表达式,问题依旧。
不断Google、baidu,总是找不到类似问题,但是,在一篇介绍spring3调度任务的文章中,提到老外们发现的一个bug,就是使用基于标记的调度任务时,任务每次会执行2次,而且spring官网已经将这个bug规划到3.2版本解决。但是,我使用的不是基于标记而是基于配置的调度任务,用E文关键字搜索一下,发现确实有类似情况,不过人家说是由于spring配置文件被多次加载造成的,多数是由于web.xml中配了spring的监听,又配置了spring的servlet造成的,但是我的web.xml比较正常,没有类似问题。
但是,由于action采用spring管理的模式,因此,在struts的配置文件中
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>而applicationContext.xml文件中有以下内容 <import resource="action-config.xml" />
<import resource="springTasks.xml" />相当于applicationContext.xml文件把所有的相关配置都加载进来。而在web.xml里面
解决办法很简答,由于之前已经把与struts相关的部分bean的配置单独拿出来放在action-config.xml文件中了,因此,直接修改struts-config.xml文件中ContextLoederPlugIn的部分为以下内容
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/action-config.xml" />
</plug-in>重新启动应用,问题解决!
刚开始,使用间隔的形式,每次任务都执行2次,一开始以为是这个间隔不是很精确造成的,后来在上线前的测试中发现,要求每周一凌晨3点执行的任务,结果一下执行2次,导致很多重复数据。
不断调整cron表达式,问题依旧。
不断Google、baidu,总是找不到类似问题,但是,在一篇介绍spring3调度任务的文章中,提到老外们发现的一个bug,就是使用基于标记的调度任务时,任务每次会执行2次,而且spring官网已经将这个bug规划到3.2版本解决。但是,我使用的不是基于标记而是基于配置的调度任务,用E文关键字搜索一下,发现确实有类似情况,不过人家说是由于spring配置文件被多次加载造成的,多数是由于web.xml中配了spring的监听,又配置了spring的servlet造成的,但是我的web.xml比较正常,没有类似问题。
但是,由于action采用spring管理的模式,因此,在struts的配置文件中
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>而applicationContext.xml文件中有以下内容 <import resource="action-config.xml" />
<import resource="springTasks.xml" />相当于applicationContext.xml文件把所有的相关配置都加载进来。而在web.xml里面
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>已经加载过一次applicationContext.xml,这样,相当于applicationContext.xml被加载两次,因此,涉及到调度任务的部分自然就会被执行两次。
解决办法很简答,由于之前已经把与struts相关的部分bean的配置单独拿出来放在action-config.xml文件中了,因此,直接修改struts-config.xml文件中ContextLoederPlugIn的部分为以下内容
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/action-config.xml" />
</plug-in>重新启动应用,问题解决!
相关文章推荐
- 推荐一款Java基于最新Spring 4.2.5 集成Quartz 2.2.2 任务调度定时器界面配置版
- 解决spring quartz定时任务执行2次的问题
- spring boot使用自定义配置的线程池执行Async异步任务
- [Web]Servlet中使用Quartz【二】基于配置文件和jobs.xml触发任务执行
- 在spring中使用quartz进行任务调度遇到的问题
- Spring @Async配置4. 基于@Async无返回值调用 使用的方式非常简单,一个标注即可解决所有的问题: 1 @Async //标注使用 2 public void asyncMe
- 任务调度5-------Spring中使用timetask执行定时任务
- 推荐一款Java基于最新Spring 4.2.5 集成Quartz 2.2.2 任务调度定时器界面配置版
- Spring 4.3.5 配置 quartz 2.2.1 任务调度遇到的问题和解决方法
- java web使用quartz执行定时任务 Spring配置quartz
- spark history server集群配置与使用(解决执行spark任务之后没有显示的问题)
- 关于在spring中配置quatrz任务执行两次的问题
- 在spring中使用quartz进行任务调度遇到的问题
- Spring 任务调度配置及使用
- spring boot使用自定义配置的线程池执行Async异步任务
- 使用spring @Scheduled注解执行定时任务
- 06 Spring 异步执行,任务调度(@Schedule、@Async)
- 基于spring的quartz定时任务的配置详述
- 在Spring中使用Quartz进行任务调度(6)
- spring线程池ThreadPoolExecutor配置并且得到任务执行的结果