在从RabbitMQ教程中提取的通用接收件中,我很难弄清楚以下代码块的放置位置:
using (IConnection connection = MessageQueue.GetConnection(myIP))
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "myqueuename", durable: true, exclusive: false, autoDelete: false, arguments: null);
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) => { DoSomething() };
channel.BasicConsume(queue: "myqueuename", autoAck: true, consumer: consumer);
}
}
我尝试将其放在函数中并调用一次,希望以后任何消息都可以到达DoSomething
函数,但是什么也没有发生。我尝试将其放在主函数中,期望代码将保持连接打开并允许任何消息进入DoSomething
函数,但也不会发生任何事情。
一个后续问题可以帮助我了解发生了什么事情
相对于consumer.Received
,向channel.BasicConsume
分配事件args有什么作用? BasicConsume
实际消耗了消息还是仅告诉接收者“嘿,这是要收听的队列。”
谢谢,我们将不胜感激。
更新
我发现在创建与消息代理的连接时使用using
语句不起作用。如果我只是这样做:
private void ReceiveMessages(string connectionIP)
{
connection = MessageQueue.GetConnection(connectionIP);
channel = connection.CreateModel();
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
channel.QueueDeclare(queue: "myqueuename", durable: true, exclusive: false, autoDelete: false, arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += Callback;
channel.BasicConsume(queue: "myqueuename", autoAck: false, consumer: consumer);
}
我在主函数中调用它,现在一切正常。回调被正确击中,传入的任何新消息都击中了我的回调。
但是,问题在于,由于连接和通道为IDisposable
,因此我需要以某种方式进行处理。我可以构造一个析构函数并在其中处置那些变量吗?