gpt4 book ai didi

java - Spring RabbitTemplate setRetryTemplate 和 setRecoveryCallback 被忽略

转载 作者:行者123 更新时间:2023-12-01 08:56:10 28 4
gpt4 key购买 nike

问题:经过固定次数的重试后,我想将消息发送到错误队列并从其原始队列中使用它。我想找到一个通用的解决方案,因为我处理很多不同的消息,并且根据它们引发的异常,我想采取不同的行动。如何设置 RecoveryCallback 以便 Spring 在 maxRetries 之后触发它?

我目前在做什么
我尝试设置 RetryTemplateRecoveryCallback。当我运行应用程序并将消息发布到 test 队列时,我预计 EListener#receive 中的处理会失败 3 次,然后触发我配置的 RecoveryCallback 然后根据上下文将消息路由到特定的错误队列。

实际发生的情况实际发生的情况是,Spring Boot 使用自己的 RabbitTemplate 初始化 RabbitAdmin 对象,因此不使用我配置的 RabbitTemplate bean。

我有以下目录结构:

rabbit
|___ EListener.java
|___ Rabbit.java
test
|___ Test.java

我在 Rabbit.java

中有以下代码
@Configuration
public class Rabbit {

@Autowired
ConnectionFactory connectionFactory;

@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setRetryTemplate(createRetryTemplate());
rabbitTemplate.setRecoveryCallback(createRecoveryCallback());
return rabbitTemplate;
}

createRecoveryCallback() // Omitted for brevity
createRetryTemplate() // Omitted for brevity
}

EListener.java 文件包含:

@Component
public class EListener {

@Autowired
RabbitTemplate rabbitTemplate;

@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "test", durable = "true"), exchange = @Exchange(value = "test", type = ExchangeTypes.TOPIC, durable = "true", autoDelete = "true"), key = "test"))
public void receive(Message m) throws Exception {
System.out.println(m);
throw new Exception();
}
}

Test.java 包含:

@SpringBootApplication
@ComponentScan("rabbit")
public class Test {

public static void main(String[] args) {
new SpringApplicationBuilder(Test.class).application().run(args);
}
}

最佳答案

RabbitTemplate添加RetryTemplate是为了重试发布消息。

要在消费者端添加重试,必须在监听器中添加重试拦截器container's advice chain .

由于您使用的是@RabbitListener,因此建议链位于 listener container factory @Bean 上。 ,这意味着您必须自己声明一个,而不是依赖于启动创建的默认值。

无状态重试在内存中进行重试;有状态重试重新排队消息;它需要一个 messageId 属性(或一些其他机制来唯一标识消息)。

关于java - Spring RabbitTemplate setRetryTemplate 和 setRecoveryCallback 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42030980/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com