【问题标题】:Connection in RabbitMQ server auto lost after 600sRabbitMQ 服务器中的连接在 600 秒后自动丢失
【发布时间】:2013-03-01 03:52:20
【问题描述】:

我正在使用带有 amq 的 rabbitMQ 服务器。

我遇到了一个难题。离开服务器大约 10 分钟后,连接断开。

这可能是什么原因造成的?

【问题讨论】:

  • 你有没有试过在创建连接的时候设置心跳值?
  • @kzhen:你如何设置心跳值?
  • 您使用的是哪个客户端?
  • @kzhen :我正在使用 erlang。请帮我解决这个问题。
  • 我的回答是否有足够的细节?如果缺少什么,请告诉我...

标签: timeout rabbitmq


【解决方案1】:

如果您查看 Erlang 客户端文档 http://www.rabbitmq.com/erlang-client-user-guide.html,您将看到标题为连接到代理的部分

这为您提供了几个不同的选项,您可以在设置与 RabbitMQ 服务器的连接时指定这些选项,其中一个选项是 heartbeat,您可以看到默认值为 0,因此没有指定心跳。

我不知道确切的 Erlang 表示法,但您需要执行以下操作:

{ok, Connection} = amqp_connection:start(#amqp_params_network{heartbeat = 5})

心跳超时以秒为单位指定。因此,这将导致您的消费者每 5 秒向服务器发送一次心跳。

也看看这个讨论:https://groups.google.com/forum/?fromgroups=#!topic/rabbitmq-discuss/u227xzvqOr8

【讨论】:

    【解决方案2】:

    RabbitMQ 连接工厂的默认连接超时是 600 秒(至少在 Java 客户端 API 中),因此是 10 分钟。您可以通过向连接工厂指定您选择的超时来更改此设置。

    最好确保您的连接在特定时间后释放并重新创建,以防止最终泄漏和过多的资源。您的代码应确保它寻求一个未关闭以超时的有效连接,并在已超时的连接上重新建立新连接。总体而言,采用连接池方法。

    - Java 示例:

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(this.serverName);
        factory.setPort(this.serverPort);
        factory.setUsername(this.userName);
        factory.setPassword(this.userPassword);
        factory.setConnectionTimeout( YOUR-TIMEOUT-IN-SECONDS ); 
    
        Connection = factory.newConnection();
    

    【讨论】:

    • 错误。有两种超时 - 一种是存储的服务器端,另一种是刚刚传递给Socket.new。后者默认为 0 == 无限,由factory.setConnectionTimeout 控制。
    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多