RabbitMQ C#客户端-消费者确认消息后,生产者可以接收事件

时间:2019-07-23 09:42:16

标签: notifications rabbitmq consumer

是否可以配置RabbitMQ,以便在使用者手动确认消息时通知使用者。

我正在使用C#RabbitMQ客户端。我已经将模型/通道设置为ConsumeSelect,但是在消费者使用该消息之前,我会收到BasicAcks事件。我假设它已经路由到队列时被确认。

我希望能够在消费者确认消息后接收事件。

我的交流和队列设置如下

model.ExchangeDeclare(exchange: "myExchange", type: "topic");
                model.QueueDeclare(queue: "myQueue", durable: false,
                                        exclusive: false,
                                        autoDelete: false,
                                        arguments: null);
                model.QueueBind(queue: "myQueue",
                    exchange: "myExchange",
                    routingKey: "myRoutingKey"); 

生产者设置如下

var factory = new ConnectionFactory()                 {

                HostName = ConfigurationManager.AppSettings["RabbitHost"],
                UserName = ConfigurationManager.AppSettings["RabbitUserName"],
                Password = ConfigurationManager.AppSettings["RabbitPassword"],
                Port = Convert.ToInt32(ConfigurationManager.AppSettings["RabbitPort"]),
            };
            var connection = factory.CreateConnection();
            var model = connection.CreateModel();
            model.ConfirmSelect();
            model.CallbackException += (s, e) =>
            {
                Console.WriteLine("Exception [{0}] [{1}] [{2}]", e.Detail, e.Exception.Message, e.Exception.StackTrace);
            };

            model.BasicReturn += (s, e) =>
            {
                var message = Encoding.UTF8.GetString(e.Body);
                Console.WriteLine("Message returned [{0}] [{1}] [{2}]", message, e.ReplyCode, e.ReplyText);
            };

            model.BasicAcks += (s, e) =>
            {
                Console.WriteLine("Message acked [delivery tag = {0}] [multiple = {1}]", e.DeliveryTag, e.Multiple);
            };

我的消息通过以下方式发送

channel.BasicPublish(交换:“ myExchange”,                                     routingKey:“ myRoutingKey”,                                     必填:true,                                     basicProperties:null,                                     正文:“我的消息”);

1 个答案:

答案 0 :(得分:0)

我现在知道我可以实现不丢失消息的目标,一开始对我来说这并不明显。

如果配置了以下内容

消息是持久的 队列持久 消费者确认已启用

这确保当主服务器和所有镜像队列都接受消息时,生产者将收到事件,从而确保数据已持久保存到磁盘。这样可以确保它们是同步的。

唯一的问题是,如果您的母带和镜像关闭并且快速连续恢复,那么消息仍然可能丢失