2014-03-19 41 views
2

我使用Spring AMQP libarary(1.1.4.Release)将消息发送到Rabbit MQ Exchange。我特别使用RabbitTemplate.correlationconvertAndSend()方法。该RabbitTemplate使用CachingConnectionFactory创建,其中PublisherConfirmsPublisherReturns设置为trueSpring AMQP Rabbit模板发送超时

最近我们发生了一个网络问题,当生产者和消费者在发送消息的过程中关闭了与RabbitMQ Broker/Exchange的连接时。这导致org.springframework.amqp.AmqpIOException: java.net.SocketException: Broken pipe被抛出。然而,问题在于这个异常在超过150s之后被抛出。这导致所有线程长时间处于阻塞状态。

是否有任何方法可以设置超时时间,以便我可以进行设置以便及早获得反馈并采取适当的措施。我正在考虑更多的http或db调用的超时值。 RabbitMQ的ConnectionFactory的连接超时值为http://www.rabbitmq.com/releases/rabbitmq-java-client/v3.1.0/rabbitmq-java-client-javadoc-3.1.0/com/rabbitmq/client/ConnectionFactory.html#setConnectionTimeout(int)

+0

更新 - 发现问题是RabbitMQ的流量控制机制在高流量期间扼杀了发布者.http://www.rabbitmq.com/memory.html#per-connection。 @ francois-gergaud,您是否知道在RabbitMQ服务器进行限制的情况下,回复超时是否有效,即我的发布者客户端将知道Connection超载并可能采取补救措施。 –

回答

0

如果您使用的是弹簧AMQP API,你应该能够根据您的连接工厂申报AMQP的模板对象,如下:

<rabbit:template id="amqpTemplate" 
     connection-factory="rabbitMQConnectionFactory" 
     reply-timeout="60000"/> 

这种方法在超过该连接的更高水平由rabbitMQ客户端提供超时。它似乎在客户端发送 - 接收过程中,在到达套接字层之前进行管理。

希望它可以帮助。