现在的位置: 首页 > 综合 > 正文

在SSH框架下使用基于配置的Spring3的调度任务每次执行2次的问题

2013年10月02日 ⁄ 综合 ⁄ 共 1354字 ⁄ 字号 评论关闭

近日,在项目中使用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>

重新启动应用,问题解决!

抱歉!评论已关闭.