【发布时间】:2019-07-23 09:42:16
【问题描述】:
是否可以配置 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(exchange: "myExchange",
routingKey: "myRoutingKey",
mandatory: true,
basicProperties: null,
body: "my message");
【问题讨论】:
-
警告说我们必须使用自动确认,这对我们来说不是一个选项。我真正的目标是确保我不会丢失消息。我意识到即使使用集群、镜像队列和持久消息,在 RabbitMQ 中仍然有可能丢失消息。所以我现在正在调查这样一种情况,我可以丢失一条消息,但我可以检测到它已经丢失。在这种情况下,我会检测到它已经丢失,因为我不会收到确认。但是,这仅在我收到消费者确认而不是确认已成功添加到队列时才有效。
标签: c# notifications rabbitmq consumer