Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java amqp-在断开连接的情况下使用自动恢复_Java_Amqp - Fatal编程技术网

Java amqp-在断开连接的情况下使用自动恢复

Java amqp-在断开连接的情况下使用自动恢复,java,amqp,Java,Amqp,我正在尝试使用自动恢复功能,以防连接中断。 我有两个问题: 1) 自动恢复代码似乎完全忽略了networkRecoveryInterval。在我的日志文件中,在连接中断的1分钟内,该文件将增长到1.5 GB。以下错误不断重复 在连接恢复期间捕获到异常! java.net.SocketException:无法在以下位置访问网络: java.net.PlainSocketImpl.socketConnect(本机方法)位于 java.net.AbstractPlainSocketImpl.doCon

我正在尝试使用自动恢复功能,以防连接中断。 我有两个问题:

1) 自动恢复代码似乎完全忽略了networkRecoveryInterval。在我的日志文件中,在连接中断的1分钟内,该文件将增长到1.5 GB。以下错误不断重复

在连接恢复期间捕获到异常! java.net.SocketException:无法在以下位置访问网络: java.net.PlainSocketImpl.socketConnect(本机方法)位于 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 位于java.net.socksocketimpl.connect(socksocketimpl.java:391) java.net.Socket.connect(Socket.java:579)位于 com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32) 在 com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:34) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverConnection(AutorecoveringConnection.java:388) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:360) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access$000(AutorecoveringConnection.java:48) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection$1.shutdownpleted(AutorecoveringConnection.java:345) 在 com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75) 在 com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:572) 运行(Thread.java:722)

2) 最后,当我打开路由器时,网络恢复不起作用。我在我的日志文件中得到了这个

恢复拓扑时捕获异常在恢复拓扑时捕获异常 正在恢复队列8923yrbk com.rabbitmq.client.TopologyRecoveryException:捕获到异常 在恢复队列8923yrbk时 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverQueues(AutorecoveringConnection.java:459) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverEntities(AutorecoveringConnection.java:424) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.beginAutomaticRecovery(AutorecoveringConnection.java:365) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.access$000(AutorecoveringConnection.java:48) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection$1.shutdownpleted(AutorecoveringConnection.java:345) 在 com.rabbitmq.client.impl.ShutdownNotifierComponent.notifyListeners(ShutdownNotifierComponent.java:75) 在 com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:572) 在java.lang.Thread.run(Thread.java:722)处,由以下原因引起: com.rabbitmq.client.AlreadyClosedException:连接已断开 由于连接错误而关闭;原因: com.rabbitmq.client.missedHeartBeateException:缺少心跳信号,带有 心跳频率=45秒 com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:190) 位于com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:223) com.rabbitmq.client.impl.AMQChannel.privatepc(AMQChannel.java:209) 在 com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:118) 位于com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:779) 在 com.rabbitmq.client.impl.recovery.AutorecoveringChannel.queueDeclare(AutorecoveringChannel.java:230) 在 com.rabbitmq.client.impl.recovery.RecordedQueue.recover(RecordedQueue.java:36) 在 com.rabbitmq.client.impl.recovery.AutorecoveringConnection.recoverQueues(AutorecoveringConnection.java:448) ... 还有7个

这是我相当简单的消费者端代码。请注意,我在一个新线程中编写所有代码,因为我不希望构造函数阻塞

private ConnectionFactory factory = null;
private Connection connection = null;
private Channel channel = null;

private PaymentInfoFromGlobalServerConsumer() {
    new Thread(new Runnable() {
        public void run() {
            factory = new ConnectionFactory();
            try {
                factory.setUri(amqpServerUrl);
                factory.setAutomaticRecoveryEnabled(true);
                factory.setNetworkRecoveryInterval(30000); // In case of broken connection, try again every 30 seconds (hope this is correct understanding)
                factory.setRequestedHeartbeat(45); //Keep sending the heartbeat every 45 seconds to prevent any routers from considering the connection stale.
            } catch (KeyManagementException | NoSuchAlgorithmException | URISyntaxException e) {
                //Will never happen if configured properly
                logger.error(e);
                return;
            }

            try {
                connection = factory.newConnection();
                channel = connection.createChannel();
                //Create a durable queue (if not already present)
                channel.queueDeclare(merchantId, true, false, false, null);

                QueueingConsumer consumer = new QueueingConsumer(channel);
                channel.basicConsume(merchantId, false, consumer);

                while (true) {
                    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
                    String billId = new String(delivery.getBody());

                    //TODO - Redeliveries are possible as per design
                    System.out.println(" [x] Received '" + billId + "'");
                    System.out.println(" [x] Done" );

                    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
                }               
            } catch (IOException | ConsumerCancelledException | InterruptedException e) {
                e.printStackTrace();
                logger.error(e);
            } catch (ShutdownSignalException e) {
                System.out.println(e.isInitiatedByApplication() + " " + e.isHardError());
            } finally {
                close();
            }
        }           
    }).start();
}

public void close() {
    try {
        if (channel != null) channel.close();
    } catch (IOException | AlreadyClosedException e) {
        //Cannot do anything now
    }
    try {
        if (connection != null) connection.close();
    } catch (IOException | AlreadyClosedException e) {
        //Cannot do anything now
    }
}

我是amqp的新手,非常感谢您的帮助。谢谢

尝试恢复拓扑和连接

factory.setTopologyRecoveryEnabled(true);

它默认启用