【问题标题】:Spring boot rabbitmq dead queue not stopping flow on exception春季启动rabbitmq死队列不停止异常流
【发布时间】:2020-08-13 06:55:50
【问题描述】:

我正在学习基于在线resources:的RabbitMQ的spring boot(2.2.5.RELEASE版本)

我遇到的问题是,当我故意抛出异常时,它应该只重试 6 次,然后消息应该被移动到死队列,但事实并非如此,因为它会不停地重试。

请在下面找到我的 application.yml:

server:
  servlet:
    contextPath: /test

spring:
  rabbitmq:
    username: guest
    password: guest
    listener:
      simple:
        retry:
          enabled: true
          initial-interval: 3s
          max-attempts: 6
          max-interval: 10s
          multiplier: 2

请在下面找到rabbitMQ配置类:

@Configuration
public class RabbitMQConfig {

 
    @Bean
    TopicExchange deadLetterExchange() {
        return new TopicExchange("deadLetterExchange");
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange("javainuseExchange");
    }

    @Bean
    Queue dlq() {
        return QueueBuilder.durable("deadLetter.queue").build();
    }

    @Bean
    Queue queue() {
        return QueueBuilder.durable("javainuse.queue").withArgument("x-dead-letter-exchange", "deadLetterExchange")
                .withArgument("x-dead-letter-routing-key", "deadLetter").build();
    }

    @Bean
    Binding DLQbinding() {
        return BindingBuilder.bind(dlq()).to(deadLetterExchange()).with("deadLetter");
    }

    @Bean
    Binding binding() {
        return BindingBuilder.bind(queue()).to(exchange()).with("javainuse");
    }

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("javainuse.queue");
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(ReceiveMessageHandler receiver) {
        return new MessageListenerAdapter(receiver, "handleMessage");
    }

}

请在我的类下面找到使用该消息的:

@Component
@Slf4j
@RequiredArgsConstructor
public class ReceiveMessageHandler {

   
    private final SendService sendService;

    public void handleMessage(@Valid dto dto) {

        String test = null;

      
        //purposely throw null pointer to test dead queue
        test.toString();

        sendService.sendSomething(dto);
   
    }

当抛出空指针异常时,它会根据 application.yml 配置继续重试而不是在 6 次 max-attempts: 6 后停止。

谁能指出我在这里缺少什么?

【问题讨论】:

    标签: java spring-boot rabbitmq spring-rabbit


    【解决方案1】:

    您正在创建自己的容器 bean,因此不会应用 .yml 属性。使用RetryInterceptorBuilder.stateless() ... 构建重试建议并将其注入侦听器容器(建议链)。

    您还需要配置恢复器。

    builder.recoverer(new RejectAndDontRequeueRecoverer());
    

    当重试用尽时,这会将队列定向到 DLQ。

    the Spring AMQP documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多