ActiveMq 与 Spring 2.5 的集成

Posted

技术标签:

【中文标题】ActiveMq 与 Spring 2.5 的集成【英文标题】:ActiveMq integration with Spring 2.5 【发布时间】:2011-02-23 17:15:31 【问题描述】:

我在 Spring 2.5.5 中使用 ActiveMq 5.32。我使用非常通用的配置,只要我包含 DefaultMessageListenerContainer 中的 jmsTransactionManager,Spring 启动时抛出错误:

“创建名为 'org.springframework.jms.listener.DefaultMessageListenerContainer#0' 的 bean 时出错”

没有transactionManager属性,这工作正常,但是当我向消息队列中添加10条消息时,会发生事务异常。

我的部分配置:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
                <property name="connectionFactory" ref="connectionFactory" />
                <property name="destination" ref="emailDestination" />
                <property name="messageListener" ref="emailServiceMDP" />
                <property name="transactionManager" ref="jmsTransactionManager" />
</bean>

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
                <property name="connectionFactory" ref="connectionFactory" />
</bean>

这个版本的 Spring 和 Activemq 在集成方面是否存在一些已知问题?或者我需要额外的库来让 jmsTransactionManager 工作吗?

更新:完整堆栈跟踪:

21:36:21 错误上下文初始化 失败的 org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'org.springframework.jms.listener.DefaultMessageListenerContainer#0' 在 ServletContext 资源中定义 [/WEB-INF/config/spring/component/applicationContext-jms-activemq5.xml]: 调用 init 方法失败; 嵌套异常是 java.lang.NoSuchMethodError: org.springframework.transaction.support.TransactionSynchronizationUtils.sameResourceFactory(Lorg/springframework/transaction/support/ResourceTransactionManager;Ljava/lang/Object;)Z 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 在 java.security.AccessController.doPrivileged(本机 方法)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381) 在 org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 在 com.suzsoft.framework.spring.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:23) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934) 在 org.apache.catalina.core.StandardContext.start(StandardContext.java:4429) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526) 在 org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:987) 在 org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:909) 在 org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:495) 在 org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206) 在 org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314) 在 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardHost.start(StandardHost.java:722) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 在 org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 在 org.apache.catalina.core.StandardService.start(StandardService.java:516) 在 org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:583) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 造成的: java.lang.NoSuchMethodError: org.springframework.transaction.support.TransactionSynchronizationUtils.sameResourceFactory(Lorg/springframework/transaction/support/ResourceTransactionManager;Ljava/lang/Object;)Z 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.initialize(AbstractPollingMessageListenerContainer.java:190) 在 org.springframework.jms.listener.DefaultMessageListenerContainer.initialize(DefaultMessageListenerContainer.java:459) 在 org.springframework.jms.listener.AbstractJmsListeningContainer.afterPropertiesSet(AbstractJmsListeningContainer.java:135) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334) ... 40 更多 2010 年 5 月 25 日晚上 9:36:21 org.apache.catalina.core.StandardContext listenerStart 严重:异常 将上下文初始化事件发送到 类的监听器实例 com.suzsoft.framework.spring.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'org.springframework.jms.listener.DefaultMessageListenerContainer#0' 在 ServletContext 资源中定义 [/WEB-INF/config/spring/component/applicationContext-jms-activemq5.xml]: 调用 init 方法失败; 嵌套异常是 java.lang.NoSuchMethodError: org.springframework.transaction.support.TransactionSynchronizationUtils.sameResourceFactory(Lorg/springframework/transaction/support/ResourceTransactionManager;Ljava/lang/Object;)Z 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 在 java.security.AccessController.doPrivileged(本机 方法)在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381) 在 org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45) 在 com.suzsoft.framework.spring.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:23) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934) 在 org.apache.catalina.core.StandardContext.start(StandardContext.java:4429) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526) 在 org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:987) 在 org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:909) 在 org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:495) 在 org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206) 在 org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314) 在 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardHost.start(StandardHost.java:722) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 在 org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 在 org.apache.catalina.core.StandardService.start(StandardService.java:516) 在 org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:583) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) 造成的: java.lang.NoSuchMethodError: org.springframework.transaction.support.TransactionSynchronizationUtils.sameResourceFactory(Lorg/springframework/transaction/support/ResourceTransactionManager;Ljava/lang/Object;)Z 在 org.springframework.jms.listener.AbstractPollingMessageListenerContainer.initialize(AbstractPollingMessageListenerContainer.java:190) 在 org.springframework.jms.listener.DefaultMessageListenerContainer.initialize(DefaultMessageListenerContainer.java:459) 在 org.springframework.jms.listener.AbstractJmsListeningContainer.afterPropertiesSet(AbstractJmsListeningContainer.java:135) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334) ... 40 更多

【问题讨论】:

您在启动时遇到的错误应该包含更多信息,例如嵌套异常、原因等。您有这个吗? Spring 应该告诉您为什么它未能创建该 bean,这将帮助您指出要修复的正确方向。 是的,马特,但我无法获得有关此错误的任何有用信息,我更新了我的帖子以包含完整的堆栈跟踪。 【参考方案1】:

这是堆栈跟踪中的真正问题:

java.lang.NoSuchMethodError: org.springframework.transaction.support.TransactionSynchronizationUtils.sameResourceFactory(Lorg/springframework/transaction/support/ResourceTransactionManager;Ljava/lang/Object;)Z at 

问题在于,无论您在类路径中使用的 spring-tx jar 的哪个版本,都不包含类/方法 TransactionSynchronizationUtils.sameResourceFactory。尽我所能确定,该方法did exist in Spring 2.5.4 但did not exist in Spring 2.5.3。我认为您需要检查您的类路径以查看您实际使用的各种 Spring jar 的版本。

FWIW,ActiveMQ 目前内部使用 2.5.6,之前使用 Spring 2.5.5。这就是我能从脑海中回想起的事情,在更早的时候,我需要做一些真正的挖掘。

希望对您有所帮助。

布鲁斯

【讨论】:

非常感谢,布鲁斯,你真的救了我的命,因为我将 spring-tx jar 更新到 2.5.6,错误消失了! 这真的很奇怪,我只成功启动了一次,然后我仍然得到同样的错误。我用的是spring 2.5.5,你说的这个方法在2.5.4就有,查看源码,2.5.5这个方法还在,不知道为什么报cant find错误。

以上是关于ActiveMq 与 Spring 2.5 的集成的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot学习笔记——Spring Boot与ActiveMQ的集成

Spring集成Activemq使用(未完待续)

Spring集成:控制ActiveMQ连接

使用 Spring、ActiveMQ 和 Qpid 进行集成测试

干货 | 从零开始学 Java - Spring 集成 ActiveMQ 配置

activeMQ学习(与springboot集成)