c# – RabbitMQ EventBasicConsumer不工作
发布时间:2020-12-15 04:20:31 所属栏目:百科 来源:网络整理
导读:背景信息 我在RabbitMQ中有一个队列(用于电子邮件),并希望为它构建一个使用者.该队列由另一个.NET应用程序用于向客户发送电子邮件.我希望电子邮件逻辑能够位于.NET应用程序之外,并且还具有RabbitMQ提供的持久性等优点. 问题 .NET应用程序能够将电子邮件发布/
背景信息
我在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,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,consumer); } } } 上面的代码应该能够从队列中获取消息并处理它们(根据这个official guide),但这不会发生. 解决方法
问题是过早的连接处理.人们通常认为BasicConsume是一个阻塞调用,但事实并非如此.它几乎会立即返回,下一个声明是处理(关闭)频道和连接,这当然会取消您的订阅.所以要修复 – 在私有字段中存储连接和模型,并且只有在完成队列消耗时才处理它们.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |