RabbitMQ EventBasicConsumer 不工作
RabbitMQ EventBasicConsumer not working
背景信息
我在 RabbitMQ 中有一个队列(用于电子邮件),我想为其构建一个消费者。该队列由另一个 .NET 应用程序用于向客户发送电子邮件。我希望电子邮件逻辑位于 .NET 应用程序之外,并且还具有 RabbitMQ 提供的持久性等优点。
问题
.NET 应用程序能够 publish/push 将电子邮件发送到队列中,但我在构建消费者时遇到了困难!这是我的消费者代码:
// A console app that would be turned into a service via TopShelf
public void Start()
{
using (_connection = _connectionFactory.CreateConnection())
{
using (var model = _connection.CreateModel())
{
model.QueueDeclare(_queueName, true, false, false, null);
model.BasicQos(0, 1, false);
var consumer = new EventingBasicConsumer(model);
consumer.Received += (channelModel, ea) =>
{
var message = (Email) ea.Body.DeSerialize(typeof(Email));
Console.WriteLine("----- Email Processed {0} : {1}", message.To, message.Subject);
model.BasicAck(ea.DeliveryTag, false);
};
var consumerTag = model.BasicConsume(_queueName, false, consumer);
}
}
}
上面的代码应该能够从队列中抓取消息并处理它们(根据这个official guide),但是这并没有发生。
你说队列被另一个 .Net 应用程序使用,那是另一个消费者吗?如果那是另一个消费者,那么您能否确认您使用的是哪个交易所?如果您希望多个消费者接收消息,请继续 "FanOut" exchange
问题是过早的连接处理。人们通常认为 BasicConsume
是阻塞调用,但事实并非如此。它几乎会立即 return,下一个语句是处理(关闭)频道和连接,这当然会取消您的订阅。因此,要修复 - 在私有字段中存储连接和模型,并仅在完成队列消耗后才处理它们。
背景信息
我在 RabbitMQ 中有一个队列(用于电子邮件),我想为其构建一个消费者。该队列由另一个 .NET 应用程序用于向客户发送电子邮件。我希望电子邮件逻辑位于 .NET 应用程序之外,并且还具有 RabbitMQ 提供的持久性等优点。
问题
.NET 应用程序能够 publish/push 将电子邮件发送到队列中,但我在构建消费者时遇到了困难!这是我的消费者代码:
// A console app that would be turned into a service via TopShelf
public void Start()
{
using (_connection = _connectionFactory.CreateConnection())
{
using (var model = _connection.CreateModel())
{
model.QueueDeclare(_queueName, true, false, false, null);
model.BasicQos(0, 1, false);
var consumer = new EventingBasicConsumer(model);
consumer.Received += (channelModel, ea) =>
{
var message = (Email) ea.Body.DeSerialize(typeof(Email));
Console.WriteLine("----- Email Processed {0} : {1}", message.To, message.Subject);
model.BasicAck(ea.DeliveryTag, false);
};
var consumerTag = model.BasicConsume(_queueName, false, consumer);
}
}
}
上面的代码应该能够从队列中抓取消息并处理它们(根据这个official guide),但是这并没有发生。
你说队列被另一个 .Net 应用程序使用,那是另一个消费者吗?如果那是另一个消费者,那么您能否确认您使用的是哪个交易所?如果您希望多个消费者接收消息,请继续 "FanOut" exchange
问题是过早的连接处理。人们通常认为 BasicConsume
是阻塞调用,但事实并非如此。它几乎会立即 return,下一个语句是处理(关闭)频道和连接,这当然会取消您的订阅。因此,要修复 - 在私有字段中存储连接和模型,并仅在完成队列消耗后才处理它们。