我第一次使用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/

10-10 19:39