2016-10-04 2 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 находится на уровне контейнера (ниже повторите попытку в стеке).

EDIT

@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 Gary ... ждет вашего сообщения –

+0

Я отредактировал свой ответ. –

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