Spring-amqp 两个不同TTL的队列
Spring-amqp two queues with different TTL
在我们的应用程序中,我们使用 RabbitMQ 和 spring-amqp(1.4.3.RELEASE)。
我们那里有两个队列。它们都配置了 TTL(60000 和 100000)。
当我们启动应用程序时,出现以下错误:
[pool-4-thread-1] ERROR org.springframework.amqp.rabbit.connection.CachingConnectionFactory - Channel shutdown: channel error; protocol method: #method(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'queue1' in vhost '/': received '60000' but current is '100000', class-id=50, method-id=10)
然后当我们尝试向队列发送消息时抛出异常:
[http-nio-8080-exec-8] ERROR [P181786EJG755SN8I3S74584216UV1] No reply received - perhaps a timeout in the template?
org.springframework.remoting.RemoteProxyFailureException: No reply received - perhaps a timeout in the template?
at org.springframework.amqp.remoting.client.AmqpClientInterceptor.invoke(AmqpClientInterceptor.java:60)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy83.getUserById(Unknown Source)
网上搜索结果如下:
http://forum.spring.io/forum/spring-projects/integration/amqp/124865-unexpected-behaviour-with-rabbit-admin
特别是这个错误:https://jira.spring.io/browse/AMQP-266
在我们发现该错误后,我们已将两个队列的 TTL 值更改为 60000,并且不再显示错误。申请 运行 没问题。
所以,看来TTL还是有bug。
我找到了问题,它与错误的配置有关。
因此,要解决此问题:
- 检查,在 Rabbit-Server 中声明的 Queue 在 spring-configurations 中具有相同的参数。
好事是从 rabbit 中完全删除队列并启动应用程序。
- 在应用程序中,可以在多个地方声明队列。检查它们是否都具有相同的参数。如果它们有不同的参数,可能会导致问题(我就是这种情况)。
Dmitrii Semenov 回复正确,仅供参考:
“尝试从 rabbitmq-management 中删除队列”
注意:从 docker 您可以访问“您的 ip 或本地主机”:15672
参考:
https://github.com/streadway/amqp/issues/60#issuecomment-18119437
我遇到了同样的问题,但配置是正确的。
只需从 rabbit 管理中删除队列,然后让 spring 在微服务启动时重新创建,现在一切正常。
在我们的应用程序中,我们使用 RabbitMQ 和 spring-amqp(1.4.3.RELEASE)。 我们那里有两个队列。它们都配置了 TTL(60000 和 100000)。 当我们启动应用程序时,出现以下错误:
[pool-4-thread-1] ERROR org.springframework.amqp.rabbit.connection.CachingConnectionFactory - Channel shutdown: channel error; protocol method: #method(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'queue1' in vhost '/': received '60000' but current is '100000', class-id=50, method-id=10)
然后当我们尝试向队列发送消息时抛出异常:
[http-nio-8080-exec-8] ERROR [P181786EJG755SN8I3S74584216UV1] No reply received - perhaps a timeout in the template? org.springframework.remoting.RemoteProxyFailureException: No reply received - perhaps a timeout in the template? at org.springframework.amqp.remoting.client.AmqpClientInterceptor.invoke(AmqpClientInterceptor.java:60) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) at com.sun.proxy.$Proxy83.getUserById(Unknown Source)
网上搜索结果如下:
http://forum.spring.io/forum/spring-projects/integration/amqp/124865-unexpected-behaviour-with-rabbit-admin 特别是这个错误:https://jira.spring.io/browse/AMQP-266
在我们发现该错误后,我们已将两个队列的 TTL 值更改为 60000,并且不再显示错误。申请 运行 没问题。 所以,看来TTL还是有bug。
我找到了问题,它与错误的配置有关。 因此,要解决此问题:
- 检查,在 Rabbit-Server 中声明的 Queue 在 spring-configurations 中具有相同的参数。 好事是从 rabbit 中完全删除队列并启动应用程序。
- 在应用程序中,可以在多个地方声明队列。检查它们是否都具有相同的参数。如果它们有不同的参数,可能会导致问题(我就是这种情况)。
Dmitrii Semenov 回复正确,仅供参考:
“尝试从 rabbitmq-management 中删除队列”
注意:从 docker 您可以访问“您的 ip 或本地主机”:15672
参考: https://github.com/streadway/amqp/issues/60#issuecomment-18119437
我遇到了同样的问题,但配置是正确的。 只需从 rabbit 管理中删除队列,然后让 spring 在微服务启动时重新创建,现在一切正常。