C#:在Web服务器上使用RabbitMQ消息

时间:2016-06-20 07:42:06

标签: c# rabbitmq

我正在使用RabbitMQ的C#Client。 许多示例使用Console.ReadLine()while(true)来保持连接打开以使用消息。 while(true)将刻录CPU,ReadLine()不适用于Web服务器。

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

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();来阻止线程,如果我不阻止,我不需要,但如果我必须阻止它会有帮助。

我有点困惑,如果我应该阻止或不,我需要多少线程等。 某处有一个有用的例子吗?

感谢..

1 个答案:

答案 0 :(得分:1)

在控制台应用程序中,如果你没有放置像Console.ReadLine这样的东西 - 进程将在它退出主线程时终止(并非总是如此,但这不是重点)。在Web服务器应用程序中不是这种情况,例如asp.net(或者更确切地说 - 你不应该为此烦恼,因为它不是你处理的)。因此 - 您不需要启动新线程然后通过等待阻塞 - 它只是没有用处并消耗一个线程。

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

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();
    }
}

当你完成时(也就是你发出事件之前的时间) - 只需将你排队。