メッセージを RabbitMQ にパブリッシュしています。RabbitMQ がダウンしたときのエラーを追跡したいと思います。このため、リカバリ コールバックを追加RetryTemplate
しましたが、リカバリ コールバックはこのメソッドのみgetLastThrowable()
を提供し、詳細を提供する方法がわかりません。 RabbitMQ がダウンしたときに失敗したメッセージ。(ドキュメントRecoveryCallback
によると、「再試行コンテキストにはフィールドのみが含まれているという点で多少制限されてい
lastThrowable
ます。より洗練されたユースケースでは、外部を使用し
て、コンテキストの属性を介してRetryTemplate
追加情報を伝えることができRecoveryCallback
ます」)しかし、私はしません誰かが素晴らしい例で私を助けることができれば、それを行う方法を知っています.
ウサギのテンプレート
public RabbitTemplate rabbitMqTemplate(RecoveryCallback publisherRecoveryCallback) {
RabbitTemplate r = new RabbitTemplate(rabbitConnectionFactory);
r.setExchange(exchangeName);
r.setRoutingKey(routingKey);
r.setConnectionFactory(rabbitConnectionFactory);
r.setMessageConverter(jsonMessageConverter());
RetryTemplate retryTemplate = new RetryTemplate();
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(500);
backOffPolicy.setMultiplier(10.0);
backOffPolicy.setMaxInterval(10000);
retryTemplate.setBackOffPolicy(backOffPolicy);
r.setRetryTemplate(retryTemplate);
r.setRecoveryCallback(publisherRecoveryCallback);
return r;
}
回復コールバック
@Component
public class PublisherRecoveryCallback implements RecoveryCallback<AssortmentEvent> {
@Override
public AssortmentEvent recover(RetryContext context) throws Exception {
log.error("Error publising event",context.getLastThrowable());
//how to get message details here??
return null;
}
}
AMQP 送信アダプタ
return IntegrationFlows.from("eventsChannel")
.split()
.handle(Amqp.outboundAdapter(rabbitMqTemplate)
.exchangeName(exchangeName)
.confirmCorrelationExpression("payload")
.confirmAckChannel(ackChannel)
.confirmNackChannel(nackChannel)
)
.get();