如何在RabbitMQ上实现Dispose()而不使用。 C#

问题描述 投票:0回答:1

我有我的发送者课程。

public class RabbitSender
    {
        private ConnectionFactory _factory;
        private IConnection _connection;
        private IModel _channel;

        public RabbitSender()
        {
            _factory = new ConnectionFactory() { HostName = "localhost" };
            _connection = _factory.CreateConnection();
            _channel = _connection.CreateModel();
            _channel.QueueDeclare(queue: "hello",
              durable: false,
              exclusive: false,
              autoDelete: false,
              arguments: null);
        }

        public void Send(SendModel print)
        {
            byte[] messageBody = print.ToByteArray();

            _channel.BasicPublish(exchange: "",
             routingKey: "hello",
             basicProperties: null,
             body: messageBody);
        }

        public void Send2(SendModel print)
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);
                byte[] messageBody = print.ToByteArray();

                channel.BasicPublish(exchange: "",
                 routingKey: "hello",
                 basicProperties: null,
                 body: messageBody);
            }
        }
    }

根据RabbitMQ网站上的文档的方法Send2()。如您所见,它正在使用

using,并且我没有内存泄漏问题。但是在这种情况下,我总是在调用方法Send2()时创建新的连接。

Send()的情况下,我创建了一次圆锥,但是在这种情况下我没有使用using。因为使用总是关闭我的_channel,所以我无法发送下一个味精。我尝试在发送后调用_channel.Dispose(),但与using之类的结果相同。而主要的问题是,如果我不释放垃圾回收器,我的内存就会泄漏。在30分钟内,我使用了86%的内存:/。万一Send2()我没有这个问题。创建连接后以及每次发送后如何清理垃圾而不关闭_channel,我该如何实现?

c# rabbitmq
1个回答
0
投票

我认为可能发生了几件事,但是核心问题是,根据文档,RabbitMQ客户端的使用不正确。

  1. 连接是昂贵的,并且应该为每个应用程序实例创建一次。请保留连接对象,并在需要创建新通道时重新使用它。

  2. 通道旨在为瞬态。您无需保留通道-可以在每次操作后将其丢弃。如果您要进行大量发布,则最好在每次发布后以与保持连接相似的方式保留频道。

  3. 当与服务器的连接断开时,您将需要一些逻辑来重新连接/重新建立您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.