RabbitMq AutorecoveringChannels собираются в памяти, даже если они закрыты в коде - PullRequest
0 голосов
/ 08 января 2019

В моем приложении 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 ().

Пожалуйста, поделитесь своей идеей со мной, если вы можете догадаться, что здесь происходит. Даже небольшие предложения, которые сделают меня в правильном направлении в этом вопросе памяти, с радостью приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...