Spring Boot RabbitMQ死队列不会在异常时停止流

问题描述

我正在使用基于在线resources:的RabbitMQ学习Spring Boot(版本2.2.5.RELEASE)

我遇到的问题是,当我有意引发异常时,它应该仅重试6次,然后将消息移至死队列,但情况并非如此,因为它会不断重试而不停止。 / p>

请在我的application.yml下找到:

<item
        android:id="@+id/settings_menu"
        android:title="Settings"
        android:icon="@drawable/ic_settings"
        app:showAsAction="always|withText" />

    <item
        android:id="@+id/manual_menu"
        android:title="User Manual"
        android:icon="@drawable/ic_developer" />

    <item
        android:id="@+id/about_menu"
        android:title="About"
        android:icon="@drawable/ic_about"/>

请在下面的rabbitMQ配置类中找到:

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

请在我的班级下面找到消耗该消息的内容

@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");
    }

}

当抛出空指针异常时,它会继续重试,而不是按照application.yml配置6次@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); } 之后停止。

请问有人可以告诉我我在这里想念的东西吗?

解决方法

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

您还需要配置恢复器。

builder.recoverer(new RejectAndDontRequeueRecoverer());

重试用尽后,哪个会将队列定向到DLQ。

请参见the Spring AMQP documentation