2014-10-31 2 views
0

저는 AMQ를 처음 접했고, 메시지를 작성하여 대기열로 보내고 비동기식으로 사용한다는 개념을 이해합니다. 예외시 AMQ MessageListenerAdapter를 중지하십시오.

내 주요 봄 구성

은 myClass가 # MyMethod라는

내 문제 그들을 잡 그때 jmsTemplate.convertAndSend (와 대기열에 물건을 보내 아무런 문제가 없다

@Bean 
    public DefaultMessageListenerContainer listenerContainer(
      MessageListenerAdapter adapter) { 
     DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer(); 
     dmlc.setConnectionFactory(connectionFactory()); 
     dmlc.setMessageListener(adapter); 
     dmlc.setDestinationName("myQueue"); 
     dmlc.setConcurrentConsumers(5); 
     return dmlc; 
    } 

@Bean 
MessageListenerAdapter adapter(MyClass myClass) { 
    MessageListenerAdapter messageListener = new MessageListenerAdapter(
      myClass); 
    messageListener.setDefaultListenerMethod("myMethod"); 
    return messageListener; 
} 

@Bean 
public JmsTemplate jmsTemplate() { 
    JmsTemplate jt = new JmsTemplate(connectionFactory()); 
    return jt; 
} 

다음)하고 있습니다 : 예외가 발생하면 메시지를 소비하지 못하게하려면 리스너가 필요합니다. 보통 예외는 원격 사이트가 오프라인이고 나중에 시도한다고 알려줍니다. 만약 내가 그것을 멈추지 않는다면 모든 메시지는 대부분 잃어버린다. 내가 다시 보낼 수있을 때까지 대기열을 가득 채우고 싶습니다.

가능합니까?

답변

0

간단한 JMS 트랜잭션을 사용하는 경우 예외가 발생할 때 메시지가 손실되는 것을 방지 할 수 있으며 리스너를 중지하고 시작할 때 걱정할 필요가 없습니다.

Here은 필요한 승인 유형을 결정하는 방법에 대한 좋은 요약입니다. 거래는 사용하는 자동 응답보다 약간 복잡한 설정이 필요합니다. 이것을 설정하는 데 좋은 비 스프링 예는 대답 here에서 찾을 수 있습니다.

+0

나는 방금 전에 내가 자동 응답하고 있다고 알았다. 시도한 메시지 .CLIENT_ACKNOWLEDGE는 대기열에있는 실패한 메시지를 유지 하겠지만 대신 전달 될 때까지 동일한 메시지에 집착합니다. – javaNoober

+0

재 배달 정책을 설정해야합니다. http://activemq.apache.org/redelivery-policy.html CLIENT_ACK은 모든 상황에 좋지 않습니다. 처리되지 않는 예외가 있기 때문에. 이 설명서에는 기본적으로 각 모드가 제공하는 기능에 대한 설명이 있습니다. http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractMessageListenerContainer.html –

관련 문제