2017-04-04 6 views
0

rabbitMQキューからメッセージを受信するためのシンプルなクライアントを開発しました。深刻なグローバルエラーが発生した場合にRabbitMQメッセージを消費しないようにする

@RabbitListener(queues = "#{'${rabbitmq.queues}'.split(',')}") 
public void receiveMessage(Message message, @Header(AmqpHeaders.CONSUMER_QUEUE) String queue) { 
logger.debug("message payload as string {}", new String(message.getBody())); 

秘密鍵をインストールしていないため、現時点で標準のSSLハンドシェイクエラーが発生しています。 エラーがあるため、メッセージは消費されず、キューに残ります。 問題は、クライアントが同じメッセージを無期限に消費しようとし続けていることです。これに対する解決策を私にアドバイスできますか? 重大なグローバルエラーが発生した場合、「while」のメッセージの消費を停止することができます。多分、スレッドスリープですか?これに春の解決策はありますか?私はここに何かを逃していますか

答えて

1

デフォルトでは、リスナーコンテナは5秒ごとに再接続を試みます。

リスナーコンテナファクトリにBackOffを追加して、コンテナを再設定できます。 〜のようなもの...

@Bean 
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setConcurrentConsumers(3); 
    final ExponentialBackOff backOff = new ExponentialBackOff(); 
    backOff.setInitialInterval(5_000); 
    backOff.setMultiplier(1.5); 
    backOff.setMaxInterval(30_000); 
    backOff.setMaxElapsedTime(120_000); 
    factory.setRecoveryBackOff(backOff); 
    return factory; 
} 
+0

私はこのコードをどこに書くべきか分かりません。主な春のクラスでは、Javaの設定としてBeanとしてautowire? @RabbitListenerを使ってリスナークラスにどのように追加しますか? – Grandmaster

+0

申し訳ありません - 単純な解決策があります。コンテナの後処理ではなく、リスナーコンテナファクトリに 'BackOff'を追加することができます。答えを更新しました。 –

関連する問題