反应堆Rabbitmq AlreadyClosedException

时间:2019-02-05 16:13:45

标签: java spring-boot rabbitmq reactor-rabbitmq amqp-client

在我的项目中,我使用的是Springboot版本2.1.2.RELEASE,反应堆-rabbitmq版本1.0.0.RELEASE。我正在创建Rabbit接收器,对其进行订阅并通过手动确认处理消息。但是经过一段时间后,可能是一个小时或工作了1-2天之后,我收到了心跳丢失错误,而不是关闭了频道,并且收到了“ com.rabbitmq.client.AlreadyClosedException:由于连接错误,连接已关闭” ;原因:java.io.IOException:连接被对等方重置”,并且我的接收方不再接收消息。仅在重新启动后才能工作。

兔子客户端有 connectionFactory.setAutomaticRecoveryEnabled(true); 和 connectionFactory.setTopologyRecoveryEnabled(true);

因此默认情况下它应该自动恢复,但不起作用。

public void startReceiver(int parallelism) {
    ConnectionFactory connectionFactory = new ConnectionFactory();
    connectionFactory.useNio();
    connectionFactory.setPort(5672);
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
    connectionFactory.setVirtualHost("/");
    connectionFactory.setRequestedHeartbeat(10);

    Address[] addresses = {new Address("localhost")};
    ReceiverOptions receiverOptions = new ReceiverOptions()
            .connectionFactory(connectionFactory)
            .connectionSupplier(cf -> cf.newConnection(addresses, "receiver"))
            .connectionSubscriptionScheduler(Schedulers.elastic());

    Receiver receiver = RabbitFlux.createReceiver(receiverOptions);
    receiver.consumeManualAck("test-data", new ConsumeOptions().qos(200))
    .doOnSubscribe(s -> System.out.println("Receiver started."))
    .retry()
    .parallel(parallelism)
    .runOn(Schedulers.newParallel("parallel-receiver", parallelism))
    .doOnNext(d -> processMessage(d))
    .subscribe();
}

private void processMessage(AcknowledgableDelivery message) {
    try {
        //some processing
    } catch (Exception e) {
        e.printStackTrace();
    }
    message.ack();
}

我遇到错误

com.rabbitmq.client.MissedHeartbeatException:心跳丢失,心跳= 10秒,     在com.rabbitmq.client.impl.AMQConnection.handleHeartbeatFailure(AMQConnection.java:686)〜[amqp-client-5.5.1.jar!/:5.5.1]中,     在com.rabbitmq.client.impl.nio.NioLoop.lambda $ handleHeartbeatFailure $ 0(NioLoop.java:273)[amqp-client-5.5.1.jar!/:5.5.1]中,     在java.lang.Thread.run(Thread.java:748)〜[na:1.8.0_181],

reactor.rabbitmq.Receiver:取消消耗来自测试数据的消费者amq.ctag--x02OWhVo3_DPutsPQ0qDw,

reactor.core.Exceptions $ ErrorCallbackNotImplemented:com.rabbitmq.client.AlreadyClosedException:由于连接错误,连接已经关闭;原因:java.io.IOException:连接被同级重置, 由以下原因引起:com.rabbitmq.client.AlreadyClosedException:由于连接错误,连接已经关闭;原因:java.io.IOException:连接被同级重置,     在com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:257)〜[amqp-client-5.5.1.jar!/:5.5.1],     在com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:426)〜[amqp-client-5.5.1.jar!/:5.5.1],     在com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:420)〜[amqp-client-5.5.1.jar!/:5.5.1],     在com.rabbitmq.client.impl.recovery.RecoveryAwareChannelN.basicAck(RecoveryAwareChannelN.java:93)〜[amqp-client-5.5.1.jar!/:5.5.1],     在com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicAck(AutorecoveringChannel.java:428)〜[amqp-client-5.5.1.jar!/:5.5.1]中,     在reactor.rabbitmq.AcknowledgableDelivery.ack(AcknowledgableDelivery.java:56)〜[reactor-rabbitmq-1.0.0.RELEASE.jar!/:1.0.0.RELEASE],     在react.rabbitmq.AcknowledgableDelivery.ack(AcknowledgableDelivery.java:73)〜[reactor-rabbitmq-1.0.0.RELEASE.jar!/:1.0.0.RELEASE],

0 个答案:

没有答案