【发布时间】:2017-07-03 08:24:47
【问题描述】:
背景信息
我在 RabbitMQ 中有一个队列(用于电子邮件),并想为它构建一个消费者。另一个 .NET 应用程序使用该队列向客户发送电子邮件。我希望电子邮件逻辑位于 .NET 应用程序之外,并且还具有 RabbitMQ 提供的持久性等优点。
问题
.NET 应用程序能够将电子邮件发布/推送到队列中,但我很难构建消费者!这是我给消费者的代码:
// 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),但这并没有发生。
【问题讨论】:
-
很多事情都可能出错。你如何发布消息(到哪个交易所)?同样在您当前的代码中 - 在您创建消费者后(
BasicConsume之后)连接将立即关闭,因此您无论如何都无法获得任何消息。不要在开始消费后立即处理您的连接。 -
@Evk 发布者和消费者都针对相同的交换和队列,这一点我很确定。但我认为你对连接处理的看法是正确的,我会解决这个问题,看看它是否有任何作用。
-
@Evk 你是对的,连接的处理是问题,请回复,我会标记为答案:)