2013-07-18 4 views
0

먼저 브로커 연결이 종료되고 다시 시작될 때 JMS MQ가 응용 프로그램에 다시 연결되도록 구성하는 방법에 대한 질문이 있습니다. 다음은 Spring MQ JMS 재 연결 구성

내가 소개 아래 구성 "DefaultMessageListenerContainer로이 교체

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

-connections.xml 스프링 MQ-JMS

내가 처음 내에서 한 구성을, 내가 뭘하려 "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 연결 팩토리를 보았지만 couldnt 숫자를 알아 냈습니다.

답변

0

DefaultMessageListenerContainer은 연결 팩터 리가 아닌 청취자 컨테이너 (브로커에서 메시지를 수신하는 데 사용됨)입니다.

방금 ​​다시 연결하기 위해 차량을 사용하는 경우 "수신 대기"하려면 더미 대기열이 필요합니다.

편집 : 아래의 의견에 따라 업데이트됩니다.

스프링 통합 사용을 고려하십시오. 자동으로 장애 조치되도록 구성 할 수 있습니다. 기본적으로

<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

... 같은

당신이 봄 통합을 사용하지 않으려면, 당신은 단순히 뭔가를 할 수있는 등, 어댑터 등을 재시도 조언을 추가, 오류 처리를위한 기능을 많이 가지고

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

시간을내어 주셔서 감사합니다. 그렇습니다. 동기는 다시 연결하는 것이지만, 더미 대기열은 언제입니까? 그것은 전혀 생성되지 않은 대기열입니까? 어떻게 설정합니까? 이 구성의 예를 제공해 주시겠습니까? – likeToCode

+0

리스너 컨테이너는 대기열에서 메시지를 수신하도록 설계되었습니다. 실패하면 자동으로 연결을 재설정하지만 데이터를 수신하지 않을 경우에도 "수신 대기"해야합니다. 그러나,이 목적을 위해 컨테이너를 사용하는 것은 약간 과잉입니다. 아마도 정확한 사용 사례를 설명해야합니다. JmsTemplate과 같은 다른 구성 요소는 연결이 끊어지면 다시 연결됩니다. 예외를 잡아서 전송을 다시 시도하면됩니다. 시도한 해결책보다는 문제가 무엇인지 설명하기 위해 질문을 업데이트해야합니다. –

+0

내가하려는 일은 큐에 메시지를 보내는 응용 프로그램이 있습니다.응용 프로그램 설정은 대기열에 대한 브로커 연결이 끊어 지거나 메시지가 손실되지 않도록 브로커 연결이 로컬 파일에 기록되어야하며 브로커 연결이 UP 인 경우 메시지는 에 쓰지 않고 대기열로 보내야합니다 로컬 파일 브로커 연결이 UP이라하더라도 파일은 여전히 ​​로컬 파일에 기록됩니다. 브로커 연결이 활성화되면 메시지가 대기열로 전송됩니다. – likeToCode