我第一次使用RabbitMQ的.NET API,我想出了一个用例对我来说似乎是合理的:我想创建一个发布器来发布消息,并在消息被Ack-ed之后执行某些操作。 IModel.BasicAcks事件似乎是发现此问题的一种不错的方式,因此-
我写了一个出版商:
private static void Post(string message) {
model.ExchangeDeclare("MyExchange", ExchangeType.Fanout, true);
model.QueueDeclare("MyQueue", true, false, false, null);
model.QueueBind("MyQueue", "MyExchange", "", new Dictionary<string, object>());
byte[] messageBodyBytes = System.Text.UTF8Encoding.ASCII.GetBytes(message);
IBasicProperties props = model.CreateBasicProperties();
props.ContentType = "text/plain";
props.DeliveryMode = 2;
model.BasicPublish("MyExchange", "", props, messageBodyBytes);
}
和订户:
private static void Receive() {
var gotten = model.BasicGet("MyQueue", false);
var text = System.Text.UTF8Encoding.ASCII.GetString(gotten.Body);
Console.WriteLine(text);
model.BasicAck(gotten.DeliveryTag, false);
}
这是控制台应用程序的入口点:
static void Main(string[] args) {
connectionFactory = new ConnectionFactory();
connectionFactory.HostName = "localhost";
connection = connectionFactory.CreateConnection();
model = connection.CreateModel();
model.BasicAcks += new RabbitMQ.Client.Events.BasicAckEventHandler(model_BasicAcks);
Post("Hello, World!");
Receive();
Console.ReadKey();
connection.Dispose();
model.Dispose();
}
由于某种原因,未调用我的事件处理程序。 “你好,世界!”消息被发布,读取,Acked并打印到控制台,但是由于某种原因,从未调用事件处理程序。
难道我做错了什么?订阅IModel.ModelShutdown似乎一切正常。
最佳答案
我会对从RabbitMQ团队收到的有关此问题的答复感到好奇。
Here's what they had to say
简而言之,该事件会触发,但这并不是我想的那样-用于发布者确认,explained in this RabbitMQ blog post
关于c# - 如何启动IModel.BasicAcks?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5784697/