【问题标题】:Lazy init not honored for JmsTemplateJmsTemplate 不支持延迟初始化
【发布时间】:2011-12-25 19:26:31
【问题描述】:

我们正在开发一个基于 Spring 的应用程序,该应用程序利用 JMSTemplate 向/从 Tibco EMS 服务器发送/接收 JMS 消息。

在当前实施中,如果 EMS 服务器关闭,则在 TomCat 启动期间项目将失败。这是因为在 Spring 配置文件中,我们有试图连接到 EMS 服务器的 JMS 相关 bean。

因此,一种解决方案是让所有与 JMS 相关的 bean 仅在需要时启动(而不是在启动期间)。为此,我们将所有与 JMS 相关的 bean 的 lazy-init 属性设置为 true。

摘录:

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager" lazy-init="true">
    <property name="internalJmsQueueConnectionFactory"> <ref bean="jmsQueueConnectionFactory" />
    </property>
</bean>

<bean id="jmsTemplateWithClientAcknowledge" class="org.springframework.jms.core.JmsTemplate" lazy-init="true">
    <property name="internalJmsQueueConnectionFactory" ref="jmsQueueConnectionFactory"/>
</bean>

这里的问题是:如果我们只在 jmsTransactionManager bean 上设置lazy-init="true",项目加载正常没有问题。然而,一旦我们在 jmsTemplateWithClientAcknowledge bean 上设置了lazy-init="true",项目就会失败。相同的失败原因:无法连接到 EMS 服务器

日志中的错误:

org.springframework.beans.factory.BeanCreationException:创建名为“jmsMsgSenderImpl”的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.springframework.jms.core.JmsTemplate com.cv.pub.engine.service.impl.JmsMsgSenderImpl.jmsTemplate;嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/spring/jms-context.xml] 中定义名称为 'jmsTemplateWithClientAcknowledge' 创建 bean 时出错:设置时无法解析对 bean 'internalJmsQueueConnectionFactory' 的引用bean 属性 'connectionFactory';嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/spring/jms-context.xml] 中定义名称为“internalJmsQueueConnectionFactory”的 bean 创建时出错:设置时无法解析对 bean“targetJmsQueueConnectionFactory”的引用bean 属性 'targetConnectionFactory';嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 ServletContext 资源 [/WEB-INF/spring/jms-context.xml] 中定义名称为“targetJmsQueueConnectionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 javax.naming.ServiceUnavailableException:无法查询 JNDI:无法连接到 tcp://localhost:7222 的服务器 [根异常是 javax.jms.JMSException:无法连接到 tcp://localhost 的服务器:7222]

非常感谢您的想法和帮助!

【问题讨论】:

  • 我们还需要查看 jmsQueueConnectionFactory 的 bean 定义

标签: spring jmstemplate


【解决方案1】:

internalJmsQueueConnectionFactory 是否正在使用 targetJmsQueueConnectionFactory?根据日志,它似乎是这样的。您将需要使 internalJmsQueueConnectionFactory 也惰性初始化。

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 2020-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多