Как связать обработку ошибок интеграции Spring и RabbitMQ с ошибкой запроса сообщения с некоторым пропущенным исключением? - PullRequest
0 голосов
/ 01 сентября 2018

Как связать 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, сообщение не требуется, но оно должно быть. Я занимаюсь поиском и поиском документации и не понимаю, как происходит ошибка, если возникает исключение. Что если добавить 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) в Docker -контейнере ??

Буду очень признателен !!

1 Ответ

0 голосов
/ 04 сентября 2018

Поток error-channel вызывается первым; он должен повторно выдать исключение, чтобы сообщение было поставлено в очередь.

...