2012-06-28 75 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

我已經嘗試了兩條建議。當連接到我無法控制防火牆並保持活動狀態的機架空間中的雲服務器時,我遇到了同樣的問題。 –