2012-06-28 35 views
2

我在遍历CISCO ASA 5505防火墙时订阅RabbitMQ消息时遇到问题。看起来在防火墙中存在某种超时,它会关闭空闲连接,并导致我的RabbitMQ订阅被无声地丢弃。结果是我的订阅者不会抛出/显示任何异常,但不会收到发布的消息。RabbitMQ用户超时

public class RabbitMqSubscriber<T extends Serializable> implements Subscriber<T> { 

    private QueueingConsumer consumer; 
    private MessageListener<T> listener; 
    private String exchange; 
    private String topic; 
    public RabbitMqSubscriber(String host,String exchange,String topic) throws IOException { 
     this.exchange=exchange; 
     this.topic=topic; 
     ConnectionFactory factory = new ConnectionFactory(); 
     factory.setHost(host); 
      factory.setRequestedHeartbeat(10); 
     Connection connection = factory.newConnection(); 
     Channel channel = connection.createChannel(); 
     channel.exchangeDeclare(exchange, "topic"); 
     String queueName = channel.queueDeclare().getQueue(); 
     channel.queueBind(queueName, exchange, topic); 
     consumer = new QueueingConsumer(channel); 
     channel.basicConsume(queueName, true, consumer); 
    } 

    public void run() { 

     while (true) { 
      QueueingConsumer.Delivery delivery; 
      try { 
       delivery = consumer.nextDelivery(); 
       Object o=SerializationUtils.deserialize(delivery.getBody()); 
       listener.receive((T)o); 
      } catch (ShutdownSignalException | ConsumerCancelledException | InterruptedException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 

    @Override 
    public void setListener(MessageListener<T> listener) { 
     this.listener=listener; 
    } 

} 

我也尝试添加到存活的服务器配置,但这并没有帮助或者:

[  {rabbit, [{tcp_listen_options, [binary, 
        {packet, raw}, 
        {reuseaddr, true}, 
        {backlog, 128}, 
        {nodelay, true}, 
        {exit_on_close, false}, 
        {keepalive, true}]}]}]. 
+0

这似乎是一个防火墙问题......在Intranet上正常工作,但在通过防火墙时无法正常工作。 –

+1

你可以实现你自己的心跳消息来保持连接的活动 - 你可以让你的用户发送消息到队列并再次接收它们。 –

回答

0

尝试设置连接超时你的连接工厂:

factory.setConnectionTimeout(timeout); 
+0

默认为0超时 –

0

疯狂的猜测是:防火墙具有缓存用于存储容量有限的网络地址转换(NAT)条目,因此会丢失空闲连接。如果内存资源仍然足够,超时可以增加。 This CISCO documentation表示正常超时时间为24小时。

0

在防火墙中出现某种类型的超时,它会关闭空闲连接并导致我的RabbitMQ订阅被无声地丢弃。

正确。思科ASA会超时不活动的TCP套接字在下列情况下:

  1. TCP套接字超出了ASA的空闲超时值
  2. TCP套接字超过NAT XLATE空闲超时

我思科ASA比RabbitMQ更熟悉。从我所看到的情况来看,即使您尝试配置它,但您似乎仍未在此会话中获得TCP Keepalive。

请尝试启用tcp keepalives的不同方法。无论是呼吁ConnectionFactorysetRequestedHeartbeat创建一个新的连接之前,或者,子类ConnectionFactory,覆盖configureSocket方法,并调用socket.setKeepAlive(true)

+0

我已经尝试了两条建议。当连接到我无法控制防火墙并保持活动状态的机架空间中的云服务器时,我遇到了同样的问题。 –