Lazy init不为JmsTemplate而感到荣幸

时间:2011-11-10 01:11:09

标签: spring jmstemplate

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

使用当前实现,在TomCat启动期间,如果EMS服务器关闭,项目将失败。这是因为在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:无法自动装配字段:private 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]

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

1 个答案:

答案 0 :(得分:0)

internalJmsQueueConnectionFactory是否正在使用targetJmsQueueConnectionFactory?根据日志,它似乎是这样的。您还需要使internalJmsQueueConnectionFactory也是lazy-init。