2016-10-04 5 views
1

나는 다음과 같은 구성을봄철 토끼가 거절 한 메시지를 전달하려고합니다. 괜찮습니까?

spring.rabbitmq.listener.prefetch=1 
spring.rabbitmq.listener.concurrency=1 
spring.rabbitmq.listener.retry.enabled=true 
spring.rabbitmq.listener.retry.max-attempts=3 
spring.rabbitmq.listener.retry.max-interval=1000 
spring.rabbitmq.listener.default-requeue-rejected=false //I have also changed it to true but the same behavior still happens 

을 내 청취자에 나는 다시 전송을 시도하는 메시지를 거부하지 토끼를 적용 할 예외를 AmqpRejectAndDontRequeueException을 던져 ...하지만 토끼 redilvers를 3 회 마지막으로 그것을 데드 레터 큐로 라우팅합니다.

제공된 구성에 따라 표준 동작이 나타나는 것입니까, 아니면 놓친 것이 있습니까?

답변

1

해당 예외에 대해 다시 시도하지 않도록 다시 시도 정책을 구성해야합니다.

속성으로 할 수 없으므로 직접 다시 시도하십시오.

도움이 필요하면 나중에 예제를 게시하겠습니다.

requeue-rejected은 컨테이너 레벨입니다 (아래에서 스택 재 시도).

편집

@SpringBootApplication 
public class So39853762Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So39853762Application.class, args); 
     Thread.sleep(60000); 
     context.close(); 
    } 

    @RabbitListener(queues = "foo") 
    public void foo(String foo) { 
     System.out.println(foo); 
     if ("foo".equals(foo)) { 
      throw new AmqpRejectAndDontRequeueException("foo"); // won't be retried. 
     } 
     else { 
      throw new IllegalStateException("bar"); // will be retried 
     } 
    } 

    @Bean 
    public ListenerRetryAdviceCustomizer retryCustomizer(SimpleRabbitListenerContainerFactory containerFactory, 
      RabbitProperties rabbitPropeties) { 
     return new ListenerRetryAdviceCustomizer(containerFactory, rabbitPropeties); 
    } 

    public static class ListenerRetryAdviceCustomizer implements InitializingBean { 

     private final SimpleRabbitListenerContainerFactory containerFactory; 

     private final RabbitProperties rabbitPropeties; 

     public ListenerRetryAdviceCustomizer(SimpleRabbitListenerContainerFactory containerFactory, 
       RabbitProperties rabbitPropeties) { 
      this.containerFactory = containerFactory; 
      this.rabbitPropeties = rabbitPropeties; 
     } 

     @Override 
     public void afterPropertiesSet() throws Exception { 
      ListenerRetry retryConfig = this.rabbitPropeties.getListener().getRetry(); 
      if (retryConfig.isEnabled()) { 
       RetryInterceptorBuilder<?> builder = (retryConfig.isStateless() 
         ? RetryInterceptorBuilder.stateless() 
         : RetryInterceptorBuilder.stateful()); 
       Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>(); 
       retryableExceptions.put(AmqpRejectAndDontRequeueException.class, false); 
       retryableExceptions.put(IllegalStateException.class, true); 
       SimpleRetryPolicy policy = 
         new SimpleRetryPolicy(retryConfig.getMaxAttempts(), retryableExceptions, true); 
       ExponentialBackOffPolicy backOff = new ExponentialBackOffPolicy(); 
       backOff.setInitialInterval(retryConfig.getInitialInterval()); 
       backOff.setMultiplier(retryConfig.getMultiplier()); 
       backOff.setMaxInterval(retryConfig.getMaxInterval()); 
       builder.retryPolicy(policy) 
        .backOffPolicy(backOff) 
        .recoverer(new RejectAndDontRequeueRecoverer()); 
       this.containerFactory.setAdviceChain(builder.build()); 
      } 
     } 

    } 

} 

참고 : 현재이 하나 "를 제외하고"모든 예외를 다시 시도하는 정책을 구성 할 수 없습니다 - 당신은 당신이 재 시도 할 모든 예외를 (분류해야하고 그들이 할 수 없습니다 AmqpRejectAndDontRequeueException의 수퍼 클래스 임). 나는 issue to support this을 열었습니다.

+0

thnx 게리 ... 내 게시물을 기다리는 중 –

+0

내 대답을 편집했습니다. –