2017-03-24 1 views
2
@Bean 
RabbitTemplate rabbitTemplate() { 
    RabbitTemplate template = new RabbitTemplate(rabbitConnectionFactory()); 
    template.setMessageConverter(messageConverter); 
    template.setExchange(amqpProperties.getRabbitMqTopicExchangeName()); 
    return template; 
} 

@Bean 
@Conditional (OperationsCondition.class) 
SimpleMessageListenerContainer opsMessageListenerContainer() { 
    return listenerContainer(amqpProperties.getRabbitMqOperationsQueue(), 
      amqpProperties.getInitialRabbitOperationsConsumerCount(), 
      amqpProperties.getMaximumRabbitOperationsConsumerCount(), 
      opsReceiver()); 
} 

@Bean 
@Conditional (OperationsCondition.class) 
OperationsListener opsReceiver() { 
    return new OperationsListener(); 
} 

private SimpleMessageListenerContainer listenerContainer(String queue, 
     int initConsumers,int maxConsumers, MessageListener listener) 
{ 
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
    container.setConnectionFactory(rabbitConnectionFactory()); 
    container.setQueueNames(queue); 
    container.setMessageListener(listener); 
    container.setConcurrentConsumers(initConsumers); 
    container.setMaxConcurrentConsumers(maxConsumers); 
    container.setMessageConverter(messageConverter); 
    return container; 
} 

메시지 리스너가 예외의 경우 루프에 간다. 문제는 메시지 수신기가 루프에 들어가고 메시지가 계속 되돌아 오는 것입니다.봄 AMQP (토끼) 리스너

내 프로세서 클래스 :

@Component 
@Transactional (propagation = Propagation.REQUIRES_NEW) 
public class OperationsProcessor 
{ 
............... 

    public void createOperation(OperationsMessage message) 
    { 
      try 
      { 
       ............. 
       ............. 
       //this call throws exception. 
       opsRepo.create(operation,null); 
      } 
      catch (Exception e) 
      { 
       logger.error(e); 
      } 

    } 
} 

opsRepo.create이 예외가 발생합니다. 비록 내가 오류를 잡기는하지만, 나는 메시지가 봄 amqp에 의해 다시 전송되지 않기를 바랬다. 왜 같은 메시지가 계속 되돌아 오는 지 잘 모르겠습니다.

편집 :

나는 내가이 처리하는 방법에 대한 몇 가지 포인터를 찾은 것 같아요. 원인은 봄이 실패하면 사건을 재촉하고 이것이 기본 성격이라는 것입니다. 도움이되는 스레드 herehere을 찾았습니다.

답변

2

귀하가 발견 한 것을 확인하기 위해, 이것은 clearly documented in the reference manual section "Exception Handling"입니다.

+0

참. 나는 몇 달 전 전체 문서를 읽은 것 같았다. 나는 중요한 부분을 놓친 것 같아. 링크 주셔서 감사합니다. 리스너에서 예외가 발생하면 AmqpRejectAndDontRequeueException을 던지고 있습니다. 이 방법은 오류가 기록되고 메시지가 다시 시도되지 않습니다. 지금 당장. – Sannu