Мы разрабатываем приложение на основе Spring, которое использует JMSTemplate для отправки / получения сообщений JMS на / с сервера Tibco EMS.
При текущей реализации во время запуска TomCat проект завершается неудачно, если EMSСервер упал.Это связано с тем, что в конфигурационном файле Spring у нас есть bean-компоненты, связанные с 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"
ТОЛЬКО на jmsTransactionManager bean, проект загрузится нормально без проблем.Однако, как только мы установим lazy-init="true"
для компонента 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: ошибка при создании компонента с именем 'jmsTemplateWithClientAcknowledge', определенным в ресурсе ServletContext [/WEB-INF/spring/jms-context.xml]: не удается разрешить ссылку на bean 'settingneactFactueсвойство бина 'connectionFactory';вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем «internalJmsQueueConnectionFactory», определенного в ресурсе ServletContext [/WEB-INF/spring/jms-context.xml]: не удается разрешить ссылку на бин 'targetnectionFactConueсвойство бина 'targetConnectionFactory';вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'targetJmsQueueConnectionFactory', определенным в ресурсе ServletContext [/WEB-INF/spring/jms-context.xml]: сбой вызова метода init;вложенным исключением является javax.naming.ServiceUnavailableException: не удалось запросить JNDI: не удалось подключиться к серверу по адресу tcp: // localhost: 7222 [корневым исключением является javax.jms.JMSException: не удалось подключиться к серверу по адресу tcp: // localhost: 7222]
Буду очень признателен за ваши мысли и помощь!