Spring对rabbitmq的amqp RPC请求获取超时

Spring对rabbitmq的amqp RPC请求获取超时,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我从几个服务器上使用AmqpTemplate.sendAndReceive func,它可以工作,并且在rabbitmq重新启动或出现网络问题后,重新连接也可以工作 它工作了好几个星期,但突然我的一个服务器变得很好 对于每个SendReceive调用超时,rabbitmq将获取消息并 正在处理,但sendAndReceive未收到响应(回复超时设置为60秒,处理消息只需几秒)。 其他服务器同时使用相同的代码和相同的队列工作 只有在我重新启动服务器上的服务后,服务器才恢复工作 我认为这是一些重新连

我从几个服务器上使用AmqpTemplate.sendAndReceive func,它可以工作,并且在rabbitmq重新启动或出现网络问题后,重新连接也可以工作

它工作了好几个星期,但突然我的一个服务器变得很好 对于每个SendReceive调用超时,rabbitmq将获取消息并 正在处理,但sendAndReceive未收到响应(回复超时设置为60秒,处理消息只需几秒)。 其他服务器同时使用相同的代码和相同的队列工作

只有在我重新启动服务器上的服务后,服务器才恢复工作

我认为这是一些重新连接问题(即使消息成功发送到rabbitmq),可能是AmqpTemplate响应侦听器没有重新连接或其他问题

有人知道可能是什么问题吗?我该如何预防 它会再次发生吗

我的连接工厂设置:

setConnectionTimeout(1000);
setRequestedHeartbeat(100);
setTopologyRecoveryEnabled(true);
setAutomaticRecoveryEnabled(true);
编辑:

Spring AMQP版本:1.4.3

<bean id="myConnectionFactory" class="path.to.myConnectionFactoryClass"></bean>

<rabbit:connection-factory id="myRabbitConnectionFactory" connection-factory="myConnectionFactory" channel-cache-size="25" />

<rabbit:template id="myTemplate" connection-factory="myRabbitConnectionFactory" reply-timeout="65000" />
不确定连接为何关闭以及为何未重新连接


位于org.springframework.amqp.rabbit.core.rabbitmplate.sendAndReceive(rabbitmplate.java:820)

在MyClass.onMessage(MyClass.java:1234)中

所以这不是服务器端的恢复;您的
MyClass
在收到消息后正在调用另一个兔子模板发送和接收操作。因此,在这种情况下,它充当客户

但是,通常情况下,只要侦听器将异常抛出到容器,rabbitmq就会重新提交消息(除非您具有确认模式NONE)。如果您的侦听器捕捉到异常,并且除了日志记录之外什么都不做,那么您将看到这个结果

如果您不希望rabbit重新提交失败的消息,或者入站容器不确认消息,您可以在出站rabbit模板中配置一个
RetryTemplate
,以恢复连接;看

如果这不能解释您的情况,您需要显示完整的配置、MyClass.onMessage()中的代码以及完整的日志


位于org.springframework.amqp.rabbit.core.rabbitmplate.sendAndReceive(rabbitmplate.java:820)

在MyClass.onMessage(MyClass.java:1234)中

所以这不是服务器端的恢复;您的
MyClass
在收到消息后正在调用另一个兔子模板发送和接收操作。因此,在这种情况下,它充当客户

但是,通常情况下,只要侦听器将异常抛出到容器,rabbitmq就会重新提交消息(除非您具有确认模式NONE)。如果您的侦听器捕捉到异常,并且除了日志记录之外什么都不做,那么您将看到这个结果

如果您不希望rabbit重新提交失败的消息,或者入站容器不确认消息,您可以在出站rabbit模板中配置一个
RetryTemplate
,以恢复连接;看

如果这不能解释您的情况,那么您需要显示完整的配置、MyClass.onMessage()中的代码以及完整的日志。

我认为问题已经解决。 我在《OnMesage》中没有发现异常,我相信它杀死了我的听众。

我认为它已经解决了。
我在OnMesage中没有发现异常,我相信它杀死了我的侦听器。

请提供完整的配置和Spring AMQP版本。Spring AMQP有自己的连接恢复机制(比rabbit客户端版本早了很长一段时间)。1.4之前的版本与rabbitmq
automaticRecoveryEnabled
不兼容。感谢Gary的评论,我使用的是v1.4.3,我编辑的文章包含了更多配置信息。这是一个非常简单的设置;接收端没有什么可“恢复”的,因为它使用直接回复到(或临时队列,取决于rabbitmq版本)进行回复;你在日志中看到什么有用的东西了吗?(此应用程序和/或rabbitmq日志)。再次发生这种情况,我看到它在收到错误后停止工作:com.rabbitmq.client.alreadCyclosedException:由于连接错误,连接已关闭;原因:java.io.EOFExceptionat org.springframework.amqp.rabbit.connection.RabbitAccessor.convertRabbitAccessException(RabbitAccessor.java:110)位于org.springframework.amqp.RabbitTemplate.doExecute(RabbitTemplate.java:1051)请提供完整的配置和Spring amqp版本。Spring AMQP有自己的连接恢复机制(比rabbit客户端版本早了很长一段时间)。1.4之前的版本与rabbitmq
automaticRecoveryEnabled
不兼容。感谢Gary的评论,我使用的是v1.4.3,我编辑的文章包含了更多配置信息。这是一个非常简单的设置;接收端没有什么可“恢复”的,因为它使用直接回复到(或临时队列,取决于rabbitmq版本)进行回复;你在日志中看到什么有用的东西了吗?(此应用程序和/或rabbitmq日志)。再次发生这种情况,我看到它在收到错误后停止工作:com.rabbitmq.client.alreadCyclosedException:由于连接错误,连接已关闭;原因:java.io.EOFExceptionat org.springframework.amqp.rabbit.connection.RabbitAccessor.convertRabbitAccessException(RabbitAccessor.java:110)位于org.springframework.amqp.RabbitTemplate.doExecute(RabbitTemplate.java:1051)请提供完整的配置和Spring amqp版本。Spring AMQP有自己的连接恢复机制(比rabbit客户端版本早了很长一段时间)。1.4之前的版本与rabbitmq
automaticRecoveryEnabled
不兼容。感谢Gary的评论,我使用的是v1.4.3,我编辑的文章包含了更多配置信息。这是一个非常简单的设置;由于是usi,接收端没有什么可“恢复”的
org.springframework.amqp.AmqpConnectException: com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; cause: java.io.EOFException
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:51)
at org.springframework.amqp.rabbit.connection.RabbitAccessor.convertRabbitAccessException(RabbitAccessor.java:110)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1051)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1028)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doSendAndReceiveWithTemporary(RabbitTemplate.java:902)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doSendAndReceive(RabbitTemplate.java:894)
at org.springframework.amqp.rabbit.core.RabbitTemplate.sendAndReceive(RabbitTemplate.java:820)
at MyClass.onMessage(MyClass.java:1234)
at sun.reflect.GeneratedMethodAccessor3558.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy95.onMessage(Unknown Source)
at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:237)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:756)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:679)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:82)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:167)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1241)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:660)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1005)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$100(SimpleMessageListenerContainer.java:82)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$2.doInTransaction(SimpleMessageListenerContainer.java:975)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$2.doInTransaction(SimpleMessageListenerContainer.java:968)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:968)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:82)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1103)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error; cause: java.io.EOFException
at com.rabbitmq.client.impl.AMQConnection.ensureIsOpen(AMQConnection.java:174)
at com.rabbitmq.client.impl.AMQConnection.createChannel(AMQConnection.java:496)
at com.rabbitmq.client.impl.recovery.AutorecoveringConnection.createChannel(AutorecoveringConnection.java:96)
at org.springframework.amqp.rabbit.connection.SimpleConnection.createChannel(SimpleConnection.java:42)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.createBareChannel(CachingConnectionFactory.java:747)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy.access$300(CachingConnectionFactory.java:736)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.doCreateBareChannel(CachingConnectionFactory.java:416)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareChannel(CachingConnectionFactory.java:392)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.access$500(CachingConnectionFactory.java:75)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:623)
at com.sun.proxy.$Proxy74.basicCancel(Unknown Source)
at org.springframework.amqp.rabbit.core.RabbitTemplate$7.doInRabbit(RabbitTemplate.java:944)
at org.springframework.amqp.rabbit.core.RabbitTemplate$7.doInRabbit(RabbitTemplate.java:902)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1045)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1028)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doSendAndReceiveWithTemporary(RabbitTemplate.java:902)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doSendAndReceive(RabbitTemplate.java:894)
at org.springframework.amqp.rabbit.core.RabbitTemplate.sendAndReceive(RabbitTemplate.java:820)