私はRabbitMQにメッセージを公開していますが、RabbitMQがダウンしたときにエラーを追跡したいと思います。復旧コールバックでRetryTemplate
を追加しましたが、復旧コールバックはこのメソッドを提供します。getLastThrowable()
RabbitMQがダウンしたときに失敗したメッセージの詳細を提供する方法がわかりません。 (ドキュメントごとに「RecoveryCallback
はやや再試行コンテキストのみ lastThrowable
フィールドが含まれていることで制限されています。あなたは を経由して、コンテキストの属性をRecoveryCallback
に追加情報を伝えることができるように、より洗練されたユースケースに対しては、外部 RetryTemplate
を使用する必要があります")しかし、誰かが私に助けになる素晴らしい一例を私が手伝ってくれたら、それをどうやって行うのか分からない。Spring 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();
問題は、私は春の統合DSLを使用しており、私はrabbitTemplateのコントロールを持っていないということです。 –
'.handle()'を使用して値を 'ThreadLocal'に格納し、次の' .handle(Amqp.outboundChannelAdapter()) 'のために返してください –
完璧なメッセージを保存しようとします)を最初のハンドル()に入れ、その値をアウトバウンドアダプターに渡してから、そのメッセージをローカルのスレッドから削除してから、ackを受け取ったら、Artem !!!!!!!ありがとう –