【问题标题】:RabbitMQ Java client 4.0.0 reconnect FailedRabbitMQ Java 客户端 4.0.0 重新连接失败
【发布时间】:2016-12-13 16:14:09
【问题描述】:

当我通过 rabbitmq 管理界面强制断开客户端连接时,它不会重新连接。我正在使用客户端 4.0.0。请在下面找到我的代码。

public void processQueue(){
    // Establishing a Connection with RabbitMQ server, 
    // running in the local machine, localhost
    ConnectionFactory factory = new ConnectionFactory();
    Connection connection=null;
    try {
        factory.setHost("localhost");
        factory.setRequestedHeartbeat(5);
        factory.setAutomaticRecoveryEnabled(true);
        factory.setConnectionTimeout(5000);
        factory.setNetworkRecoveryInterval(10000);
        connection = factory.newConnection();

        // creating a channel with first_queue
        Channel channel = connection.createChannel();
        channel.queueDeclare("xyz", true, false, false, null);


        // creating the Consumer, that will be receive a message and convert to String
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                    byte[] body) throws IOException {
                String message = new String(body, "UTF-8");
                System.out.println("Java Queue - Message Received '" + message + "'");
            }
        };
        // loop that waits for message      
        channel.basicConsume("xyz", true, consumer);

    } catch (Exception e) {
        System.out.println("server is Down !");
        System.out.println(e.getMessage());
        try {
            if(connection!=null)
                connection.close();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}

我有一个无法重新连接的简单消费者程序。我关注了这篇文章,但它也无济于事RabbitMQ Java client auto reconnect。谁能帮我解决这个问题?

【问题讨论】:

    标签: java rabbitmq


    【解决方案1】:

    我从 rabbitmq-user 邮件列表中获得了一些信息。希望这会对某人有所帮助。

    连接恢复绝不依赖于队列的存在。 用于恢复的算法记录在 http://www.rabbitmq.com/api-guide.html

    什么会被视为触发连接恢复的事件?

    • I/O 线程中的任何异常(这涉及网络连接问题)。
    • 跳过的对等心跳 (http://rabbitmq.com/heartbeats.html)
    • 服务器发送的 connection.close(由 CLI 和管理 UI 中的连接关闭操作使用)

    正如我之前提到的,后者是一个有争议的话题,因为你不能强制关闭连接 流氓应用程序没有放弃恢复 - 它通常不会这样做。

    什么不会触发连接恢复?

    • 当您有意使用 Connection#close() 或 #abort() 关闭它时。
    • 通道异常 - 通道没有被有意恢复,因为它们的处理完全是特定于应用程序的

    测试连接恢复的最简单方法是关闭您的节点,等待一段时间然后重新启动它。 您也可以使用 iptables 等,但您必须等待错过的心跳 - 请参阅该指南了解更多详细信息。

    在 Wireshark (https://www.rabbitmq.com/amqp-wireshark.html) 中看到重新连接尝试应该很简单,服务器日志 或者——因为你使用的是 4.0 版本的客户端——客户端日志中至少应该有一些东西。 还有连接恢复生命周期监听器: https://github.com/rabbitmq/rabbitmq-java-client/pull/144

    我非常有信心在 3.6.6 和 4.0.0 客户端中没有容易遇到的恢复问题。我们修复了一些已知的 3.6.6 中的问题,与他们的记者确认了修复,并且可能在几个月内没有看到新问题的报告。

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多