问题描述
我正在使用基于在线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。