在 SimpleRabbitListenerContainerFactory 中使用 RetryInterceptorBuilder 重试时如何启用异常日志记录?
How to enable exception logging when retrying using RetryInterceptorBuilder in SimpleRabbitListenerContainerFactory?
我有一个 SimpleRabbitListenerContainerFactory
定义如下:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(rabbitMQEventMessageConverter());
factory.setRecoveryBackOff(new ExponentialBackOff());
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
factory.setAdviceChain(RetryInterceptorBuilder
.stateless()
.maxAttempts(Integer.MAX_VALUE)
.backOffOptions(1000, 2, 5000)
.build());
return factory;
}
问题是,如果用 @RabbitListner
注释的方法抛出异常,则不会记录此异常。尽管重试了该方法,但我希望在下一次重试之前看到记录的堆栈跟踪。我怎样才能做到这一点?
请注意,我没有使用 Spring 启动,而是使用香草 Spring 4.x(如果这有什么不同的话)。
不,您真的不需要 Spring 引导来解决问题。您会看到该选项称为 setAdviceChain()
。所以,你真的可以实现一个简单的 MethodInterceptor
并在重试后将其添加到链中。在此建议中,您在 invocation.proceed()
上捕获异常,记录它并重新抛出以让重试建议执行其逻辑。
我有一个 SimpleRabbitListenerContainerFactory
定义如下:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(rabbitMQEventMessageConverter());
factory.setRecoveryBackOff(new ExponentialBackOff());
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
factory.setAdviceChain(RetryInterceptorBuilder
.stateless()
.maxAttempts(Integer.MAX_VALUE)
.backOffOptions(1000, 2, 5000)
.build());
return factory;
}
问题是,如果用 @RabbitListner
注释的方法抛出异常,则不会记录此异常。尽管重试了该方法,但我希望在下一次重试之前看到记录的堆栈跟踪。我怎样才能做到这一点?
请注意,我没有使用 Spring 启动,而是使用香草 Spring 4.x(如果这有什么不同的话)。
不,您真的不需要 Spring 引导来解决问题。您会看到该选项称为 setAdviceChain()
。所以,你真的可以实现一个简单的 MethodInterceptor
并在重试后将其添加到链中。在此建议中,您在 invocation.proceed()
上捕获异常,记录它并重新抛出以让重试建议执行其逻辑。