Ленивый init не соблюдается для JmsTemplate

Мы разрабатываем приложение на основе 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]

Буду очень признателен за ваши мысли и помощь!


person Erikson    schedule 10.11.2011    source источник
comment
Нам также нужно будет увидеть определение bean-компонента для jmsQueueConnectionFactory   -  person skaffman    schedule 10.11.2011


Ответы (1)


Используется ли targetJmsQueueConnectionFactory в internalJmsQueueConnectionFactory? Судя по протоколу, это так. Вам нужно будет сделать internalJmsQueueConnectionFactory также lazy-init.

person Umesh Rajbhandari    schedule 10.11.2011