2017-07-26 18 views
1

私は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();

答えて

0

機能RabbitTemplate.execute()が既にメッセージについて認識していないので、ザ・することはできません送信する可能性があるためb我々が対処するメッセージがない可能性があります他の方法から行っE:私はあなたがするお勧めは何

return this.retryTemplate.execute(
        (RetryCallback<T, Exception>) context -> RabbitTemplate.this.doExecute(action, connectionFactory), 
        (RecoveryCallback<T>) this.recoveryCallback); 

は、送信前にThreadLocalにメッセージを格納し、カスタムRecoveryCallbackから、そこからそれを得るようなものです。

+0

問題は、私は春の統合DSLを使用しており、私はrabbitTemplateのコントロールを持っていないということです。 –

+1

'.handle()'を使用して値を 'ThreadLocal'に格納し、次の' .handle(Amqp.outboundChannelAdapter()) 'のために返してください –

+1

完璧なメッセージを保存しようとします)を最初のハンドル()に入れ、その値をアウトバウンドアダプターに渡してから、そのメッセージをローカルのスレッドから削除してから、ackを受け取ったら、Artem !!!!!!!ありがとう –

関連する問題