Как связать 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
-контейнере ??
Буду очень признателен !!