在我的项目中,我使用的是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],