Мы разрабатываем приложение на основе Spring, которое использует JMSTemplate для отправки / получения сообщений JMS на / от сервера Tibco EMS.
В текущей реализации во время запуска TomCat проект завершается ошибкой, если сервер EMS не работает. Это связано с тем, что в конфигурационном файле Spring у нас есть компоненты, связанные с JMS, которые пытаются подключиться к серверу EMS.
Итак, одно из решений - заставить все связанные с JMS bean-компоненты запускаться только тогда, когда они требуются (а не во время запуска). Для этого мы устанавливаем для атрибута lazy-init всех JMS-компонентов значение 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>
Вот проблема: если мы установим lazy-init="true"
ТОЛЬКО для bean-компонента jmsTransactionManager, проект загрузится нормально без проблем. Однако, как только мы установим lazy-init="true"
в bean-компоненте jmsTemplateWithClientAcknowledge, проект завершится ошибкой. Та же причина сбоя: не удалось подключиться к серверу EMS.
Ошибка из журнала:
org.springframework.beans.factory.BeanCreationException: Ошибка при создании bean-компонента с именем jmsMsgSenderImpl: не удалось ввести автоматически подключенные зависимости; вложенное исключение - org.springframework.beans.factory.BeanCreationException: не удалось автоматически подключить поле: private org.springframework.jms.core.JmsTemplate com.cv.pub.engine.service.impl.JmsMsgSenderImpl.jmsTemplate; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем jmsTemplateWithClientAcknowledge, определенным в ресурсе ServletContext [/WEB-INF/spring/jms-context.xml]: не удается разрешить ссылку на bean-компонент «internalJmsQueueConnection» свойство bean 'connectionFactory'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «internalJmsQueueConnectionFactory», определенным в ресурсе ServletContext [/WEB-INF/spring/jms-context.xml]: не удается разрешить ссылку на bean-компонент «targetJmsQueueConnection» свойство bean 'targetConnectionFactory'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'targetJmsQueueConnectionFactory', определенным в ресурсе ServletContext [/WEB-INF/spring/jms-context.xml]: не удалось вызвать метод инициализации; вложенное исключение - javax.naming.ServiceUnavailableException: не удалось запросить JNDI: не удалось подключиться к серверу по tcp: // localhost: 7222 [корневое исключение - javax.jms.JMSException: не удалось подключиться к серверу по tcp: // localhost : 7222]
Буду очень признателен за ваши мысли и помощь!
jmsQueueConnectionFactory
- person skaffman   schedule 10.11.2011