使用带有连接/拓扑自动恢复的自动删除队列时,RabbitMQ内存泄漏

时间:2016-06-24 11:00:26

标签: .net rabbitmq

在启用自动恢复连接和拓扑之后,程序集RabbitMQ.Client - RabbitMQ的.NET客户端出现内存泄漏问题。 有保留的对象:RabbitMQ.Client.Framing.Impl.AutorecoveringConnection(更具体地说,有词典System.Collections.Generic.Dictionary<String, RecordedConsumer>System.Collections.Generic.Dictionary<String, RecordedQueue>)。

我在Java client documentation中找到了有关RabbitMQ客户端的有用信息:

  

但是,客户端无法跟踪这些拓扑更改   单一连接。依赖于自动删除队列或的应用程序   交换,以及队列TTL(注意:不是消息TTL!),并使用   自动连接恢复,应该明确删除实体知道   要么被闲置或删除,要清除客户端拓扑缓存。

因此我决定在致电QueueDeclareOk QueueDeclare(string queue, bool durable, bool exclusive, bool autoDelete, IDictionary<string, object> arguments);后立即将其从客户端的缓存中删除 我是这样做的:

    /// <summary>
    /// Removes a queue from client's autorecovery cache when it's needed.
    /// </summary>
    private void DeleteFromRecordedQueues(string queue, IDictionary<string, object> queueArgs)
    {
        if (!RabbitMqUtils.IsTemporaryQueue(queueArgs))
            return;

        var autoRecoveringConnection = connection as AutorecoveringConnection;
        if (autoRecoveringConnection == null)
            return;

        autoRecoveringConnection.DeleteRecordedQueue(queue);
    }

使用此方法public RecordedConsumer DeleteRecordedConsumer(string consumerTag)

与消费者大致相同

这种方法适用于短生活队列, 但是,如果我的队列生存时间设置为很长一段时间(例如30分钟),我希望它在网络出现问题时自动恢复呢?

我的同事建议我使用job,检查RecordedQueues对服务器上现有的所有队列,并运行DeleteFromRecordedQueues以防它不再存在。但我不喜欢这个解决方案,因为我认为必须使用标准的客户端库函数来解决这个问题。

是否可以逃避内存泄漏并且不会丢失自动删除队列的自动恢复功能?

0 个答案:

没有答案