В моем приложении RabbitMQ RPC я использую одно соединение RabbitMQ и канал для каждого публикуемого сообщения. Таким образом, канал закрывается, как только сообщение отвечает результатом. Довольно простое приложение.
Несмотря на то, что я закрываю каналы (я отслеживал журналы времени выполнения и проверял, все ли каналы закрыты), экземпляры объекта AutorecoveringChannel собираются и растут в памяти. Я не уверен, почему это происходит. Поскольку я ожидаю, что клиент RabbitMQ сотрет все данные и каналы после закрытия канала.
Я искал в Google и везде, чтобы знать почему, но каждая статья говорит просто, чтобы закрыть канал, который это. Для идеи, пожалуйста, проверьте этот скриншот результатов VisualVM растущих объектов.
Object instances
com.rabbitmq.client.impl.recovery.AutorecoveringChannel 249
com.rabbitmq.client.impl.recovery.RecordedQueue 502
com.rabbitmq.client.impl.recovery.RecordedQueueBinding 502
com.rabbitmq.client.impl.recovery.RecoveryAwareChannelN 255
Так я создаю канал в каждом сообщении, полученном через веб-сокеты
Channel channel = rabbitMqController.getRmqConnection().createChannel();
//some code
DefaultConsumer consumer = getConsumer(methodCall, channel, callbackFunction);
//some code
channel.basicConsume(replyQueueName, true, consumer);
channel.basicConsume(statusReplyQueueName, true, consumer);
channel.basicPublish(WorkerConfig.getInstance().getWorkerExchangeName(), methodCall.getMethod(), true, props,
methodCall.toJson());
И в getConsumer () я закрываю канал следующим образом, как только сообщение ответило.
return new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
closeChannel(channel);
//handling code goes here
}
closeChannel - это просто channel.close ().
Пожалуйста, поделитесь своей идеей со мной, если вы можете догадаться, что здесь происходит. Даже небольшие предложения, которые сделают меня в правильном направлении в этом вопросе памяти, с радостью приветствуются.