如何绑定Spring集成错误处理和RabbitMQ错误处理以重新排队消息失败并出现一些跳过的异常?

问题描述 投票:0回答:1

如何绑定Spring集成errorChannel(错误处理)和RabbitMQ错误处理(listenerContainer的errorChannel)以重新排队消息失败并带有一些跳过的异常?

我有一个基于Spring的项目写在Groovy上使用RabbitMQ。配置是:

    <int:service-activator id="GlobalErrorHandler" input-channel="errorChannel" 
ref="globalErrorHandler"/>

    <int-amqp:inbound-channel-adapter id="event-processing-inbound-rabbit-adapter"
                                          channel="mli-forever-event-processing-channel"
                                          error-channel="errorChannel"
                                          mapped-request-headers="*"
                                          listener-container="listenerContainer"/>

@Bean
    SimpleMessageListenerContainer listenerContainer( final CachingConnectionFactory connectionFactory, 
       final ApplicationProperties configuration ) {

        new SimpleMessageListenerContainer( connectionFactory ).with {
            concurrentConsumers = configuration.concurrentConsumers
            queueNames = configuration.rabbitQueueName
            autoDeclare = true
            it
        }
    }

仅记录日志的错误处理程序:

class GlobalErrorHandler extends AbstractFeedbackAware {
    @ServiceActivator
    void handleMessagingException( final MessagingException exception ) {
        feedbackProvider.sendFeedback( CoreFeedbackContext.CONSUMING_EVENT_ERROR, exception.message )
    }
}

如果我得到异常PersistenceException消息不会重新排队,但它应该。我在Google上搜索和阅读文档,如果发生异常,我不理解错误方式。如果将errorHandler添加到containerListener,将会调用哪些处理程序?都??订单是什么?我在考虑一些东西:

new SimpleMessageListenerContainer( null ).with {
    errorHandler = { it instanceof PersistenceException } as ConditionalRejectingErrorHandler
    it
}
class ExceptionStrategyToAvoidPersistenceException extends ConditionalRejectingErrorHandler.DefaultExceptionStrategy {

    @Override
    boolean isFatal( final Throwable t ) {
        super.isFatal( t ) && !( t instanceof PersistenceException )
    }
}

但我不明白为什么PersistenceException不会重新排队,因为它不在默认异常策略的致命错误列表中。有些人可以帮我解决问题吗?或者给出一些解释?或者如何重现集成测试中的错误,因为我不能限制PostgreSQL容器中的DB(Docker)空间?

将非常感激!!

java spring groovy rabbitmq spring-integration
1个回答
0
投票

首先调用error-channel流;它必须重新抛出异常才能使消息重新排队。

© www.soinside.com 2019 - 2024. All rights reserved.