以下のシナリオ:私は@RabbitListener
がRabbitMQからのメッセージを受け取っています。関連するビジネスオブジェクトが見つからないため、メッセージがエラーになることがあります。この場合、私は送信者に返信する可能性がないので、一定の再試行後にこのメッセージを無視したいだけです。ビジネスエラーベストプラクティスでAMQP @RabbitListenerカスタムを再試行します
私の解決策:私の@RabbitListener
では、ビジネスオブジェクトを見つけることができないときはいつでも、私はカスタムランタイム例外をスローします。私の設定では、私はRetryOperationsInterceptor
と最大の試みとカスタムリカバリーを持っています。
このようなケースを処理するためのベストプラクティスは何ですか? @RabbitListener
が複数ある場合、異なるリカバリー・クラスを構成できますか?
私configuraionを参照してください:
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setMessageConverter(new CustomMessageConverter());
factory.setConnectionFactory(connectionFactory());
factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
factory.setConcurrentConsumers(1);
factory.setMaxConcurrentConsumers(20);
Advice[] adviceChain = new Advice[] { interceptor() };
factory.setAdviceChain(adviceChain);
return factory;
}
@Bean
RetryOperationsInterceptor interceptor() {
return RetryInterceptorBuilder.stateless()
.maxAttempts(5)
.recoverer(new CustomRejectAndRecoverer())
.build();
}
そして、これは私のCustomRejectAndRecoverer
です:
public class CustomRejectAndRecoverer implements MessageRecoverer {
@Override
public void recover(Message message, Throwable cause) {
if (ExceptionUtils.getRootCause(cause) instanceof BusinessObjectNotFoundRuntimeException) {
throw new ListenerExecutionFailedException("Retry Policy Exhausted",
new AmqpRejectAndDontRequeueException(cause), message);
}
}
}
Thxは大きな改善のようです。コンシューマ向けの属性を追加することも検討しましたか?消費者の数が違うリスナーを欲しがるときは、複数のコンテナ工場を持たなければなりません。 – stritzi
「改善」[JIRA Issue](https://jira.spring.io/browse/AMQP)を開いてください。もちろん、[貢献は常に歓迎です](https://github.com/spring-projects /spring-amqp/blob/master/CONTRIBUTING.adoc)。 –