- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:经过固定次数的重试后,我想将消息发送到错误队列并从其原始队列中使用它。我想找到一个通用的解决方案,因为我处理很多不同的消息,并且根据它们引发的异常,我想采取不同的行动。如何设置 RecoveryCallback
以便 Spring 在 maxRetries
之后触发它?
我目前在做什么
我尝试设置 RetryTemplate
和 RecoveryCallback
。当我运行应用程序并将消息发布到 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/
问题:经过固定次数的重试后,我想将消息发送到错误队列并从其原始队列中使用它。我想找到一个通用的解决方案,因为我处理很多不同的消息,并且根据它们引发的异常,我想采取不同的行动。如何设置 Recovery
我是一名优秀的程序员,十分优秀!