【问题标题】:C#: Consuming RabbitMQ Messages on Web ServerC#:在 Web 服务器上使用 RabbitMQ 消息
【发布时间】:2016-06-20 15:50:24
【问题描述】:

我正在使用 RabbitMQ 的 C# 客户端。 许多示例使用Console.ReadLine()while(true) 来保持连接打开以使用消息。 while(true) 会烧毁 CPU,ReadLine() 并不真正适用于 Web 服务器。

我正在使用 Asp.Net Core Web Service 并尝试为其编写一些测试。 在我的服务器的启动方法中,我称之为

Task.Factory.StartNew(() =>
        {
            using (IConnection connection = _connectionFactory.CreateConnection())
            {
                using (IModel channel = connection.CreateModel())
                {
                    // configuring queue etc....
                    options.DeclareConsumer(queueName, MessageReceived);

                    ResetEvent.WaitOne();
                }
            }
        });

我不会在任何地方等待这项任务。当然,我希望我的网络服务器仍能处理请求。

在我的集成测试中,我将能够使用MailMessageQueue.ResetEvent.Set(); 停止线程,如果我不阻止我不需要,但如果我必须阻止它会很有帮助..

我有点困惑是否应该阻塞,我需要多少线程等等。 有什么有用的例子吗?

谢谢..

【问题讨论】:

    标签: c# rabbitmq


    【解决方案1】:

    在控制台应用程序中,如果您不输入 Console.ReadLine 之类的内容 - 进程将在退出主线程时终止(并非总是如此,但这不是重点)。这在 web 服务器应用程序中不是这种情况,比如 asp.net(或者更确切地说 - 你不应该为此烦恼,因为它不是由你处理的)。正因为如此 - 你不需要启动新线程然后通过等待阻塞 - 它只是没有做任何有用的事情并消耗一个线程。

    因为兔子消费者已经在内部单独的线程上运行,只需删除您的 using 块并在主线程中创建连接和通道:

    class MailMessageQueue : IDisposable {
        private IConnection _connection;
        private IModel _channel;
    
        public void Start() {
            _connection = _connectionFactory.CreateConnection();
            _channel = connection.CreateModel();
            // configuring queue etc....
            options.DeclareConsumer(queueName, MessageReceived);
        }
    
        public void Stop() {
            _channel.Dispose();
            _connection.Dispose();
        }
    
        public void Dispose() {
            Stop();
        }
    }
    

    完成后(即在您发出活动信号之前的时间)- 将您排在队列中。

    【讨论】:

    • 感谢您的快速答复。会试试这个,看起来很有希望:)
    猜你喜欢
    • 1970-01-01
    • 2014-06-01
    • 2020-01-10
    • 2018-12-28
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2016-11-05
    相关资源
    最近更新 更多