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这看起来是一个很大的改进。您是否也考虑过为并发消费者添加属性?当我想让不同的听众拥有不同数量的消费者时,我也被迫拥有多个集装箱工厂。你应该打开一个“改进”,当然。