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;
    }

}

我也尝试将 keepalive 添加到服务器配置中,但这也没有帮助:

[        {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 空闲超时

我对 Cisco ASA 比对 RabbitMQ 更熟悉。从我所见,即使您尝试配置它,您似乎也没有在此会话上获得 TCP keepalives。

请尝试启用 tcp keepalive 的不同方法。setRequestedHeartbeatConnectionFactory创建新连接之前调用,或者,子类ConnectionFactory,覆盖configureSocket方法,然后调用socket.setKeepAlive(true)

于 2012-07-12T04:18:19.527 回答
0

尝试使用您的连接工厂设置连接超时:

factory.setConnectionTimeout(timeout);
于 2012-07-08T10:50:37.930 回答
0

一个疯狂的猜测:防火墙有一个用于网络地址转换 (NAT) 条目的缓存,但存储容量有限,因此会丢弃空闲连接。如果内存资源仍然足够,可以增加超时。这个 CISCO 文档说正常超时是 24 小时。

于 2012-07-08T11:15:42.130 回答