如何绑定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
)空间?
将非常感激!!
首先调用error-channel
流;它必须重新抛出异常才能使消息重新排队。