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

在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里面
<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>重新启动应用,问题解决!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息