2

CISCO ASA 5505 ファイアウォールを通過するときに、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}]}]}]. 
4

3 に答える 3

0

ファイアウォールに何らかのタイムアウトがあり、アイドル状態の接続を閉じて、RabbitMQ サブスクリプションがサイレントにドロップされるようです。

正しい。Cisco ASA は、次の状況で非アクティブな TCP ソケットをタイムアウトにします。

  1. TCP ソケットが ASA のアイドル タイムアウト値を超えています
  2. TCP ソケットが NAT xlate アイドル タイムアウトを超えています

私は、RabbitMQ よりも Cisco ASA に精通しています。私が見る限り、設定しようとしても、このセッションで TCP キープアライブを取得していないようです。

tcp キープアライブを有効にするさまざまな方法を試してください。setRequestedHeartbeat新しい接続を作成する前に を呼び出すConnectionFactoryか、サブクラス化ConnectionFactoryしてメソッドをオーバーライドしconfigureSocket、 を呼び出しますsocket.setKeepAlive(true)

于 2012-07-12T04:18:19.527 に答える
0

大まかな推測: ファイアウォールにはネットワーク アドレス変換 (NAT) エントリ用のキャッシュがあり、ストレージ容量が限られているため、アイドル状態の接続がドロップされます。メモリ リソースがまだ十分にある場合は、タイムアウトを増やすことができます。この CISCO のドキュメントによると、通常のタイムアウトは 24 時間です。

于 2012-07-08T11:15:42.130 に答える
0

接続ファクトリーで接続タイムアウトを設定してみてください。

factory.setConnectionTimeout(timeout);
于 2012-07-08T10:50:37.930 に答える