Rabbitmq Spring amqp listen因未知原因退出。(原因:试图使用封闭通道)

Rabbitmq Spring amqp listen因未知原因退出。(原因:试图使用封闭通道),rabbitmq,amqp,spring-amqp,Rabbitmq,Amqp,Spring Amqp,我们正在使用rabbitmq作为消息传递中间件运行许多服务。 当服务运行时,我们看到服务停止侦听请求,需要我们重新启动服务以使其重新工作。 我们在同一个JVM(OracleWebLogicApplicationServer)上运行多个服务,但并非所有服务都停止,通常只有一个,但并不总是同一个 它似乎与负载无关,因为服务具有非常不同的负载配置文件 我们设置了heartbeat协议,但它没有解决问题。由于该问题也发生在我们的测试环境中,我们将日志级别设置为debug,希望这能揭示原因并提示解决方案

我们正在使用rabbitmq作为消息传递中间件运行许多服务。 当服务运行时,我们看到服务停止侦听请求,需要我们重新启动服务以使其重新工作。 我们在同一个JVM(OracleWebLogicApplicationServer)上运行多个服务,但并非所有服务都停止,通常只有一个,但并不总是同一个

它似乎与负载无关,因为服务具有非常不同的负载配置文件

我们设置了heartbeat协议,但它没有解决问题。由于该问题也发生在我们的测试环境中,我们将日志级别设置为debug,希望这能揭示原因并提示解决方案

遗憾的是,它没有或者我们对正在发生的事情缺乏了解(不太熟悉spring amqp和amqp库,但我们阅读了spring文档)

我们在日志中看到以下异常,在重新启动服务之前,不会发生任何异常:

;2015-05-08 00:35:54,578; DEBUG; servicename=; clusterid=; username=; msguuid=; org.springframework.amqp.rabbit.core.RabbitAdmin - Declarations finished
;2015-05-08 00:37:12,015; ERROR; servicename=; clusterid=; username=; msguuid=; nl.pharmapartners.amqp.connectors.AmqpMessageListenerContainer - Consumer received fatal exception on startup
;org.springframework.amqp.rabbit.listener.FatalListenerStartupException: Authentication failure
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:367)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:963)
    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:57)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:195)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:359)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareChannel(CachingConnectionFactory.java:309)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getCachedChannelProxy(CachingConnectionFactory.java:283)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.getChannel(CachingConnectionFactory.java:276)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.access$600(CachingConnectionFactory.java:69)
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createChannel(CachingConnectionFactory.java:614)
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils$1.createChannel(ConnectionFactoryUtils.java:85)
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.doGetTransactionalResourceHolder(ConnectionFactoryUtils.java:134)
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.getTransactionalResourceHolder(ConnectionFactoryUtils.java:67)
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:363)
    ... 2 more
Caused by: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:373)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:516)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:191)
    ... 12 more
Caused by: com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:223)
    at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:209)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:202)
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:355)
    ... 15 more
2015-05-08 00:37:12,032; ERROR; servicename=; clusterid=; username=; msguuid=; nl.pharmapartners.amqp.connectors.AmqpMessageListenerContainer - Stopping container from aborted consumer
我们不知道发生了什么,在此之前,我们几乎每分钟都会看到呼气、队列和绑定被重新声明。此日志发生在重新声明完成后约1,5分钟。 没有表明rabbitmq存在问题的日志记录,因此我们对报告的使用已关闭连接的尝试没有任何线索。这些都来自amqp客户端或spring amqp库

我在rabbit集群上找不到相关的错误日志记录,但我只查看了/var/log/rabbitmq目录

日志似乎表明存在身份验证问题,但使用相同身份验证参数在同一节点上运行的其他服务没有问题(并且服务本身已经运行了相当长的时间(最多天)也没有任何问题。原始异常表示库获得了一个新通道,但在使用之前它已经关闭

有人能解释一下发生了什么,以及可能如何解决这个问题吗

我们正在使用Spring amqp版本1.3.2、amqp客户端3.2.4运行RabbitMQ 3.3.3/Erlang 17

其他信息: 我们正在使用默认值配置各种组件,但以下例外情况除外:

#The waiting time (ms) for a response in amqp (for rpc calls)
amqp.timeout=30000
prefetch.count=1
max.concurrent.consumers=5
start.consumer.min.interval=500
stop.consumer.min.interval=5000
consecutive.active.trigger=3
consecutive.idle.trigger=3
amqp.message.ttl=900000
amqp.heartbeat=5
RabbitMQ有一个策略,该策略将删除在120秒以上没有使用者的队列。所有队列都镜像到rabbit群集中的所有节点(3个节点)

我们发现我们使用了一个CachingConnectionFactory,其默认缓存大小为1(我们将对此进行更改,因为这似乎不适合5个并发使用者,我们认为这至少应该等于最大使用者)

提前感谢,


Wim Veldhuis。

正如我在rabbitmq用户组中所说的,这个“通道”是一个用于验证新连接的内部特殊通道

Caused by: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:373)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:516)
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:191)
    ... 12 more
Caused by: com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:223)
    at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:209)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:202)
    at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:355)
    ... 15 more
如您所见,我们正在尝试创建一个新连接

com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
    at     org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:191)
大概是因为现有的连接由于某种原因关闭了

而这个异常发生在身份验证期间;Spring AMQP从未重新获得控制权

同样,正如我在小组中所说的,您需要查看rabbitmq服务器日志,看看是否有任何线索

缓存与用户通道无关-它们无论如何都不符合缓存条件(自1.1.3起)

编辑:

在1.2.1中,我们将用户请求后的身份验证错误更改为致命错误,这是用户请求的结果(如果凭据不正确,则继续尝试没有意义)

但是,rabbitmq客户端中似乎存在竞争条件,即如果连接在打开后立即关闭(在身份验证之前),则会报告为
可能的身份验证失败异常


我们可以添加一个选项,将
PossibleAuthenticationFailureException
视为非致命(并继续尝试)。请随意打开a,我们来看看。

听起来很合理,我将与网络人员和开发团队聊天,看看是否可以从rabbit机器上获取日志记录。我们确实看到连接被关闭,但没有关闭的原因。默认的RabbitMQ日志记录信息量不大:(,我们可能也必须在那里进行日志记录。您知道是否有解决方法吗?因此,当检测到此问题时,我们会继续重试,直到它再次工作为止?不幸的是,身份验证错误被认为是致命的,因此容器被停止。您可以使用一些外部监视器调用
isRunning()
不时调用
start()
重新启动容器。我们还找到了JHalterman()的Lyra库,我们也在考虑使用它。你熟悉吗?我不熟悉lyra;我不知道它是否处理我在对答案的编辑中引用的种族条件。我们最终采用了一种两阶段的方法,这对我们来说是正确的:1.我们将连接工厂子类化,以忽略异常(基本上可重试为rethrow).2.我们添加了一个以固定时间间隔进行轮询的单例,以查看连接是否仍处于活动状态,并在连接关闭时重新初始化。感谢所有帮助。