Java Spring AMQP@RabbitListener业务错误自定义重试最佳实践
以下场景:我有一个Java Spring AMQP@RabbitListener业务错误自定义重试最佳实践,java,spring,spring-amqp,Java,Spring,Spring Amqp,以下场景:我有一个@RabbitListener从RabbitMQ接收消息。有时消息会出错,因为我找不到相关的业务对象。在这种情况下,我没有可能回复发件人,所以我只想在一定程度的重试后忽略此消息 我的解决方案:在我的@RabbitListener中,每当无法找到业务对象时,我抛出一个自定义运行时异常。在我的配置中,我有一个具有最大尝试次数的RetryOperationsInterceptor和一个自定义恢复程序 处理此类案件的最佳做法是什么?当有多个@RabbitListener时,我可以配置不
@RabbitListener
从RabbitMQ接收消息。有时消息会出错,因为我找不到相关的业务对象。在这种情况下,我没有可能回复发件人,所以我只想在一定程度的重试后忽略此消息
我的解决方案:在我的@RabbitListener
中,每当无法找到业务对象时,我抛出一个自定义运行时异常。在我的配置中,我有一个具有最大尝试次数的RetryOperationsInterceptor
和一个自定义恢复程序
处理此类案件的最佳做法是什么?当有多个@RabbitListener
时,我可以配置不同的恢复程序类吗
请参阅我的配置:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setMessageConverter(new CustomMessageConverter());
factory.setConnectionFactory(connectionFactory());
factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
factory.setConcurrentConsumers(1);
factory.setMaxConcurrentConsumers(20);
Advice[] adviceChain = new Advice[] { interceptor() };
factory.setAdviceChain(adviceChain);
return factory;
}
@Bean
RetryOperationsInterceptor interceptor() {
return RetryInterceptorBuilder.stateless()
.maxAttempts(5)
.recoverer(new CustomRejectAndRecoverer())
.build();
}
这是我的客户拒绝和回复程序
:
public class CustomRejectAndRecoverer implements MessageRecoverer {
@Override
public void recover(Message message, Throwable cause) {
if (ExceptionUtils.getRootCause(cause) instanceof BusinessObjectNotFoundRuntimeException) {
throw new ListenerExecutionFailedException("Retry Policy Exhausted",
new AmqpRejectAndDontRequeueException(cause), message);
}
}
}
如果共享的
SimpleRableBitListenerContainerFactory
中的通用逻辑不符合您对特定@RabbitListener
的要求,您必须使用这些自定义选项声明一个新的逻辑,例如,关于此问题的新MessageRecoverer
为此,@RabbitListener
具有以下属性:
/**
* The bean name of the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
* to use to create the message listener container responsible to serve this endpoint.
* <p>If not specified, the default container factory is used, if any.
* @return the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
* bean name.
*/
String containerFactory() default "";
/**
*{@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}的bean名称
*用于创建负责服务于此端点的消息侦听器容器。
*如果未指定,则使用默认容器工厂(如果有)。
*@返回{@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory}
*豆名。
*/
字符串containerFactory()默认为“”;
对于每个不同的重试配置,您当前需要不同的容器工厂
在中,我们为注释添加了一个新的errorHandler
属性,这样每个侦听器都可以有一个自定义的错误处理程序,而不管它是由哪个容器工厂创建的
这是在,;目前的里程碑是M2,M3将很快推出。GA预计将在6月发布。Thx这看起来是一个很大的改进。您是否也考虑过为并发消费者添加属性?当我想让不同的听众拥有不同数量的消费者时,我也被迫拥有多个集装箱工厂。你应该打开一个“改进”,当然。