相关疑难解决方法(0)

Spring AMQP v1.4.2 - 网络故障时兔子重新连接问题

我正在测试Spring AMQP v1.4.2中的以下场景,并且在网络中断后无法重新连接:

  1. 启动spring应用程序,使用rabbit:listener-container和rabbit:connection-factory(详细配置如下)异步使用消息.
  2. 日志显示应用程序正在成功接收消息.
  3. 通过删除Rabbit服务器上的入站网络流量,使RabbitMQ对应用程序不可见: sudo iptables -A INPUT -p tcp --destination-port 5672 -j DROP
  4. 等待至少3分钟(网络连接超时).
  5. 修复连接: sudo iptables -D INPUT -p tcp --destination-port 5672 -j DROP
  6. 等待一段时间(甚至尝试了一个多小时)并且没有重新连接.
  7. 重新启动应用程序,它再次开始接收消息,这意味着网络恢复正常.

我还测试了与VM网络适配器断开而不是iptables drop相同的情况,同样的事情发生,即没有自动重新连接.有趣的是,当我尝试iptables REJECT而不是DROP时,它按预期工作,一旦我删除拒绝规则,应用程序就会重新启动,但我认为拒绝更像是服务器故障而不是网络故障.

根据参考文件:

如果MessageListener因业务异常而失败,则异常由消息侦听器容器处理,然后返回侦听另一条消息.如果失败是由连接断开(不是业务异常)引起的,则必须取消并重新启动正在为侦听器收集消息的使用者.SimpleMessageListenerContainer无缝地处理它,并留下一个日志来说明正在重新启动监听器.事实上,它无休止地循环尝试重新启动消费者,并且只有当消费者表现得非常糟糕时才会放弃.一个副作用是,如果代理在容器启动时关闭,它将继续尝试直到可以建立连接.

这是我断开连接一分钟后得到的日志:

    2015-01-16 14:00:42,433 WARN  [SimpleAsyncTaskExecutor-5] org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer Consumer raised exception, processing can restart if the connection factory supports it
com.rabbitmq.client.ShutdownSignalException: connection error
    at com.rabbitmq.client.impl.AMQConnection.startShutdown(AMQConnection.java:717) ~[amqp-client-3.4.2.jar:na]
    at com.rabbitmq.client.impl.AMQConnection.shutdown(AMQConnection.java:707) ~[amqp-client-3.4.2.jar:na]
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:565) ~[amqp-client-3.4.2.jar:na]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_55]
Caused by: java.io.EOFException: null
    at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:290) ~[na:1.7.0_55] …
Run Code Online (Sandbox Code Playgroud)

spring spring-amqp

13
推荐指数
1
解决办法
1万
查看次数

标签 统计

spring ×1

spring-amqp ×1