在启用自动恢复连接和拓扑之后,程序集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
以防它不再存在。但我不喜欢这个解决方案,因为我认为必须使用标准的客户端库函数来解决这个问题。
是否可以逃避内存泄漏并且不会丢失自动删除队列的自动恢复功能?