Ленивый инициат не удостоен чести для JmsTemplate - PullRequest
1 голос
/ 10 ноября 2011

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

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

1 Ответ

0 голосов
/ 10 ноября 2011

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

...