首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RabbitMQ订阅服务器超时

RabbitMQ订阅服务器超时
EN

Stack Overflow用户
提问于 2012-06-28 21:22:30
回答 3查看 2.5K关注 0票数 2

我在订阅穿越CISCO ASA 5505防火墙的RabbitMQ消息时遇到问题。防火墙中似乎存在某种类型的超时,这会关闭空闲连接,并导致我的RabbitMQ订阅被静默丢弃。结果是我的订阅者没有抛出/显示任何异常,但没有接收到发布的消息。

代码语言:javascript
运行
复制
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添加到服务器配置中,但这也没有什么帮助:

代码语言:javascript
运行
复制
[        {rabbit, [{tcp_listen_options, [binary, 
                     {packet, raw}, 
                     {reuseaddr, true}, 
                     {backlog, 128}, 
                     {nodelay, true}, 
                     {exit_on_close, false}, 
                     {keepalive, true}]}]}]. 
EN

回答 3

Stack Overflow用户

发布于 2012-07-08 18:50:38

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

代码语言:javascript
运行
复制
factory.setConnectionTimeout(timeout);
票数 0
EN

Stack Overflow用户

发布于 2012-07-08 19:15:42

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

票数 0
EN

Stack Overflow用户

发布于 2012-07-12 12:18:20

防火墙中似乎存在某种类型的超时,这会关闭空闲连接,并导致我的RabbitMQ订阅被静默丢弃。

对,是这样。在以下情况下,Cisco ASA将使非活动TCP套接字超时:

  1. tcp套接字超过ASA的空闲超时值
  2. tcp套接字超过NAT xlate空闲超时

与RabbitMQ相比,我更熟悉Cisco ASA。在我看来,尽管您尝试配置了此会话,但您似乎无法在此会话上获得TCP keepalives。

请尝试使用不同的方法启用tcp keepalives。在创建新连接之前在ConnectionFactory上调用setRequestedHeartbeat,或者在子类ConnectionFactory中重写configureSocket方法,然后调用socket.setKeepAlive(true)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11245626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档