定时任务每次都执行两次的问题,慎用new ClassPathXmlApplicationContext()
程序员文章站
2022-07-12 18:43:15
...
1.问题描述
singleton的bean,spring配置定时任务<task:scheduled-tasks>新增一个定时任务后每次触发定时任务都是执行两次。
2.问题分析
新增的定时任务类有点特殊,里面调用了另一个不受spring管理的对象,这个对象里又需要使用spring管理的单例bean,就在对象里使用了new ClassPathXmlApplicationContext()然后getBean()获取。
一切看似正常,问题就出在new ClassPathXmlApplicationContext()这里。当显式的这样调用的时候,会再次加载bean,初始化spring上下文环境。相当于容器里除了刚启动时的一套之外又产生了一条spring上下文,当然定时任务也有了两套。
这里还说明另一个问题,单实例的bean并不是“单例模式”,只是保证一套spring上下文里只有一个bean实例。
3.解决办法
方法1)把新增的定时任务类也纳入spring管理范围,直接获取其他spring管理的bean.
方法2)使用ApplicationContextAware获取容器启动时的spring上下文环境。
还可以参考:
http://blog.csdn.net/budapest/article/details/38493003
http://www.blogjava.net/freeman1984/archive/2010/08/30/330214.html
singleton的bean,spring配置定时任务<task:scheduled-tasks>新增一个定时任务后每次触发定时任务都是执行两次。
2.问题分析
新增的定时任务类有点特殊,里面调用了另一个不受spring管理的对象,这个对象里又需要使用spring管理的单例bean,就在对象里使用了new ClassPathXmlApplicationContext()然后getBean()获取。
一切看似正常,问题就出在new ClassPathXmlApplicationContext()这里。当显式的这样调用的时候,会再次加载bean,初始化spring上下文环境。相当于容器里除了刚启动时的一套之外又产生了一条spring上下文,当然定时任务也有了两套。
这里还说明另一个问题,单实例的bean并不是“单例模式”,只是保证一套spring上下文里只有一个bean实例。
3.解决办法
方法1)把新增的定时任务类也纳入spring管理范围,直接获取其他spring管理的bean.
方法2)使用ApplicationContextAware获取容器启动时的spring上下文环境。
还可以参考:
http://blog.csdn.net/budapest/article/details/38493003
http://www.blogjava.net/freeman1984/archive/2010/08/30/330214.html
下一篇: 如何优雅地使用同步代码 处理异步流程