2013-07-18 3 views
0

Сначала у меня возник вопрос о том, как настроить JMS MQ для повторного подключения к приложению, когда соединение брокера выключается и перезапускается.Конфигурация повторного подключения Spring MQ JMS

Ниже то, что я пытался,

Это конфигурация, что я изначально имел в своем весенне-MQ-JMS-connections.xml

<!-- Spring JMS Queue Connection Factory --> 
     <!-- 
     <bean id="jmsQueueConnectionFactory.7" 
      class="org.springframework.jms.connection.SingleConnectionFactory" > 
      <property name="targetConnectionFactory"> 
       <ref bean="internalJmsQueueConnectionFactory.7"/> 
      </property> 
     </bean> --> 

я заменил это с ниже конфигурацией, введенной «DefaultMessageListenerContainer », который обернет« SingleConnectionFactory ».

<bean id="jmsQueueConnectionFactory.7" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory"> 
      <ref bean="single.connection.factory.7"/> 
     </property> 

     <property name="recoveryInterval" value="5000"/> 

    </bean> 

    <bean id="single.connection.factory.7" class="org.springframework.jms.connection.SingleConnectionFactory"> 
    <property name="targetConnectionFactory"> 
     <ref bean="internalJmsQueueConnectionFactory.7"/> 
    </property> 
    </bean> 

Но после этого изменения конфигурации я начал получать следующее исключение.

Failed to configure emapi: 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'senderAgent.7' defined in URL 
[file://localhost/home/qos/qosdata/config/general/emapi/spring-mq-jms-connections.xml]: 
Cannot resolve reference to bean 'jmsQueueTemplate.7' while setting bean property 'jmsTemplate'; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'jmsQueueTemplate.7' defined in URL 
[file://localhost/home/qos/qosdata/config/general/emapi/spring-mq-jms-connections.xml]: 
Cannot resolve reference to bean 'jmsQueueConnectionFactory.7' while setting bean property 'connectionFactory'; 
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'jmsQueueConnectionFactory.7' defined in URL [file://localhost/home/qos/qosdata/config/general/emapi/spring-mq-jms-connections.xml]: 
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 
Property 'destination' or 'destinationName' is required 
     at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) 
     at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1244) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1008) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
     at java.security.AccessController.doPrivileged(Native Method) 

Это говорит требуется «назначения» или «destinationName», я имею дело с унаследованным кодом, не зная, где искать это или я делаю правильно, когда я изменил конфигурацию.

Просьба предложить, если есть лучший способ повторно подключить OpenMQ к приложению, когда соединение брокера прекращается из-за исключения или при его перезапуске. Я также посмотрел на фабрику подключения пружин jms с прослушивателем исключений, но не мог понять.

ответ

0

A DefaultMessageListenerContainer является контейнером слушателя (используется для приема сообщений от брокера), а не фабрики соединений.

Если вы просто используете его в качестве транспортного средства для повторного подключения, ему нужна пустая очередь для «прослушивания».

EDIT: Обновлено в ответ на ваш комментарий ниже.

Рассмотрите возможность использования Spring Integration; он может быть настроен на автоматическое завершение работы; что-то вроде

<int:gateway service interface="foo.Bar" default-request-channel="foo" /> 

<int:channel id="foo"> 
    <int:dispatcher load-balancer="false"/> 
<int:channel/> 

<int-jms:outbound-channel-adapter channel="foo" order="1" ... /> 

<int-file:outbound-channel-adapter channel="foo" order="2" mode="APPEND" ... /> 

По умолчанию диспетчер балансировки нагрузки (циклическое обслуживание) для двух адаптеров путем включения и выключения балансировки нагрузки он всегда будет отправить его в JMS и не к файлу.

Spring Integration также имеет множество функций для обработки ошибок, добавляя советы повторов для адаптера и т.д., и т.д.

Если вы не хотите использовать Spring Integration, вы можете просто сделать что-то вроде ...

try { 
    this.jmsTemplate.send(...); 
} 
catch (Exception e) { 
    writeToFile(...); 
} 
+0

Благодарим вас за то, что нашли время, чтобы ответить. Да, мотив заключается в повторном подключении, но когда вы подразумеваете под пустую очередь? Это очередь, которая не создана вообще? Как его установить? Не могли бы вы привести пример конфигурации для этого? – likeToCode

+0

Контейнер-слушатель предназначен для приема сообщений из очереди - он будет автоматически восстанавливать соединение, если он терпит неудачу, но ему нужна очередь для «прослушивания», даже если данные никогда не будут получены. Тем не менее, для этой цели немного излишне использовать контейнер. Возможно, вам следует объяснить ваш конкретный прецедент - другие компоненты (например, JmsTemplate) будут повторно подключаться, если соединение не работает. Вам просто нужно поймать исключение и повторить отправку. Вы должны обновить свой вопрос, чтобы объяснить возникшую у вас проблему, а не решение, которое вы пробовали. –

+0

То, что я пытаюсь сделать, это приложение, которое отправляет сообщения в очередь.Настройка приложения - это когда соединение брокера с Очереди отключено, сообщения должны быть записаны в локальный файл, чтобы мы не потеряли никаких сообщений, а когда соединение с брокером - UP, сообщения должны быть отправлены в очередь вместо того, чтобы писать в локальный файл. Прямо сейчас, хотя соединение с брокером - UP, файл все еще записывается в локальный файл, я рассматриваю решение, где, когда соединение брокера UP, сообщения будут отправляться в очередь. – likeToCode

Смежные вопросы