2016-10-10 99 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.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java在com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66) 连接错误 :com.rabbitmq.client.ShutdownSignalException: 36) 在com.rabbitmq.client.impl.AMQChannel $ BlockingRpcContinuation.getReply(AMQChannel.java:366) 在com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:233) 在com.rabbitmq。 client.impl.AMQChannel.rpc(AMQChannel.java:211) at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:326) –

+0

导致:java.net.SocketException:连接超时 在java .net.SocketInputStream.socketRead0(本地方法) at java.net.SocketInputStream.read(SocketInputStream.java:152) at 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个空格。要获得更多编辑帮助,请单击[?]工具栏图标。所以我添加一些意见来发布我的问题 –

回答

0

目标代码如下:

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

所以,连接的问题的确并非必须与认证有关。

还有ShutdownSignalExceptionConnection timed out原因。

因此,您应该尝试增加连接超时,默认为60000

但是,由于我们无法连接,所以代理上的资源可能存在一些问题。

我们不能将这种错误(ShutdownSignalException)视为非致命的,因为您的问题恰好发生在start()上。

EDIT

在致命故障的情况下,容器发射ListenerContainerConsumerFailedEventhttp://docs.spring.io/spring-amqp/reference/html/_reference.html#consumer-events。您可以处理它并故意重新启动容器。

+0

但这个错误没有发生在我启动应用程序,它发生在运行一个星期在线的项目,它在错误之前正常工作。以及我应该设置什么样的超时时间?回复,接收或连接超时?如果我设置为-1,它永远不会超时,对吗?并且超时将影响java.io.BufferedInputStream.read方法?因为我看到错误是由它引起的。 –

+0

连接超时,因为您无法连接到代理。 BufferedInputStream.read只是低层的连接等待来自套接字服务器的回复。正如我所说的:看起来经纪人存在资源泄漏。所以,一周之后就无法为你打开新的连接。也许你不会关闭旧的连接...或者你的目标消费者被永久阻止,Listener Container被迫启动新的和新的连接以赶上队列中的消息... –

+0

感谢您的回复!所以增加超时并不是解决我的问题的方法,我应该找到mq服务器泄露资源的原因。和我只使用sping amqp消耗来连接到该服务器,我应该关闭我的代码中的一些连接?我有一个消费者服务器连接到该服务器在不同的虚拟主机,它工作正常,并没有encouter超时问题。 –