我正在测试Spring AMQP v1.4.2中的以下场景,并且在网络中断后无法重新连接:
sudo iptables -A INPUT -p tcp --destination-port 5672 -j DROP
sudo iptables -D INPUT -p tcp --destination-port 5672 -j DROP
我还测试了与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)