2016-10-10 15 views
0

私の消費者は、消費者のスレッドは以下のエラーが死亡したと記録され、一週間程度うまく働い:認証失敗スプリング-AMQPタイムアウト

It seems the Authentication failure is caused by BufferedInputStream.read timeout, and I want to know if there is a way to treat the Authentication failure as a non-fatal and do not kill the consumer thread. and I think the timeout issue is just caused by network issue not the Authentication failure, since this consumer already worked for one week.

org.springframework.amqp.rabbit.listener.exception.FatalListenerStartupException: Authentication failure 
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:460) 
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1171) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.amqp.AmqpAuthenticationException: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure 
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:61) 
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:296) 
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:524) 
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createConnection(ConnectionFactoryUtils.java:85) 
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:135) 
at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:71) 
at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:456) 
... 2 more 
Caused by: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure 
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:341) 
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:824) 
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:736) 
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:283) 
... 7 more 
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error at com.rabbitmq.utility.ValueOrException.getValue(ValueOrExcept‌​ion.java:66) at com.rabbitmq.utility.BlockingValueOrException.uninterruptibl‌​eGetValue(BlockingVa‌​lueOrException.java:‌​36) at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.‌​getReply(AMQChannel.‌​java:366) at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.ja‌​va:233) at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:211) at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.j‌​ava:326) 
+0

com.rabbitmq.utility.ValueOrException.getValueで接続エラー (ValueOrException.java:66)com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValueで (BlockingValueOrException.java。 36)com.rabbitmq.client.impl.AMQChannel $ BlockingRpcContinuation.getReply(AMQChannel.java:366)com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:233で )com.rabbitmqで で 。 (AMQChannel.java:211) –

+0

原因:java.net.SocketException:接続がタイムアウトしました at java .net.SocketInputStream.socketRead0(ネイティブメソッド) java.net.SocketInputStream.read(SocketInputStream.java:152) java.net.SocketInputStream.read(SocketInputStream.java:122) at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) ) at java.io.BufferedInputStream.read(BufferedInputStream.java:254) at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288) at com.rabbitmq.client.impl.Frame.readFrom(Frame.java :94) at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:138) –

+0

ここに質問をしてもらうのは初めてです。あなたの投稿には、コードとして適切に書式設定されていないコードが含まれているようです。コードツールバーボタンまたはCTRL + Kキーボードショートカットを使用して、すべてのコードを4つのスペースでインデントしてください。詳細な編集ヘルプについては、[?]ツールバーicoをクリックしてください。私は質問を投稿するためにいくつかのコメントを追加する –

答えて

0

ターゲット・コードは次のようになります。

} catch (ShutdownSignalException e) { 
... 
    throw new PossibleAuthenticationFailureException(e); 
} 

実際、接続に関する問題は認証に関する必要はありません。

Connection timed outの理由により、ちょうどShutdownSignalExceptionがあります。

したがって、接続タイムアウトを増やすことをお勧めします。これは、デフォルトでは60000です。

しかし、私たちは接続できないため、ブローカのリソースに問題がある可能性があります。

この種のエラー(ShutdownSignalException)は、致命的ではないとみなされます。問題はstart()で発生するためです。

EDIT

は致命的な障害が発生した場合には、容器は、ListenerContainerConsumerFailedEventを発する:http://docs.spring.io/spring-amqp/reference/html/_reference.html#consumer-events。それを処理して、コンテナを目的に応じて再起動することができます。 com.rabbitmq.client.ShutdownSignalException:によって引き起こさ

+0

しかし、このエラーは私がアプリケーションを開始するときに起こっていない、それは1週間オンラインで実行されているプロジェクトで起こった、それはエラーの前に正常に働いた。どのようなタイムアウトを設定する必要がありますか?返信、受信、または接続タイムアウト? -1に設定した場合、タイムアウトになることはありません。そうですか?タイムアウトはjava.io.BufferedInputStream.readメソッドに影響します。なぜなら、エラーが発生したことがわかったからです。 –

+0

ブローカに接続できないため、接続タイムアウトが発生しました。 'BufferedInputStream.read'は、接続がソケットサーバーからの応答をどのように待つかを示す低レベルです。私が言ったように、ブローカーにリソースが漏れているように見えます。だから、週の後に新しい接続を開くことはできません。おそらくあなたはどこかに古い接続を閉じないかもしれません...あるいは、ターゲットコンシューマが永久にブロックされているので、リスナコンテナは新しい接続を開始してキューからメッセージをキャッチアップするように強制されます... –

+0

あなたの返信に感謝します!タイムアウトを増やすことは私の問題を解決する方法ではない、私はなぜMQがリソースを漏らすのかを知るべきだ。と私はそのサーバーに接続するためにsping amqp消費を使用する、私は自分のコードでいくつかの接続を閉じる必要がありますか?と私は別の仮想ホストでそのサーバーに接続する別の消費者のサーバーを持って、それは正常に動作し、タイムアウトの問題をencouterしません。 –

関連する問題