gpt4 book ai didi

c# - C# 客户端上的 RabbitMQ 手动 ACK

转载 作者:太空狗 更新时间:2023-10-29 22:36:21 25 4
gpt4 key购买 nike

我正在尝试在一个非常简单的控制台应用程序上使用手动 ACK,但我无法让它工作。

在发件人上,我有以下代码:

var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);

var message = GetMessage(args);
var body = Encoding.UTF8.GetBytes(message);

channel.ConfirmSelect();
channel.BasicAcks += (sender, e) =>
{
Console.Write("ACK received");
};

var properties = channel.CreateBasicProperties();

channel.BasicPublish(exchange: "",
routingKey: "task_queue",
basicProperties: properties,
body: body);

Console.WriteLine(" [x] Sent {0}", message);
}

Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

在接收器上我有以下代码:

var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "task_queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);

channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
channel.ConfirmSelect();

Console.WriteLine(" [*] Waiting for messages.");

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

int dots = message.Split('.').Length - 1;
Thread.Sleep(dots * 1000);

channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
Console.WriteLine(" [x] Done");
};
channel.BasicConsume(queue: "task_queue",
noAck: false,
consumer: consumer);

Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}

我期望的是,当我调用接收方的 channel.BasicAck() 时,发送方的事件 BasicAcks 被触发,但是当消息在 consumer.Received 之前传递给客户端。

我期望的是正确的行为还是我遗漏了什么?

最佳答案

您的期望不正确。 BasicAcks 是关于 publisher confirms ,而不是关于接收方的确认。因此,您向代理发布消息,代理(因此,RabbitMQ 本身)将在处理此消息时(例如,当它将其写入磁盘以获取持久消息时)ack 或 nack(否定确认) ,或者在将其放入队列时)。请注意,此处不涉及接收方 - 它完全在发布方和 RabbitMQ 之间。

现在,当您在接收方确认消息时——同样仅在接收方和 RabbitMQ 之间——您告诉兔子消息已处理并且可以安全删除。这样做是为了处理接收者在处理过程中崩溃的情况——然后 rabbit 将能够将此消息传递给下一个接收者(如果有的话)。

请注意,这种架构的全部目的是将发布者和接收者分开 - 他们不应相互依赖。

如果您有一个接收方(可以有多个)并且您希望确保它处理了您的消息 - 使用 RPC 模式:发送消息并等待该接收方返回另一条消息。

关于c# - C# 客户端上的 RabbitMQ 手动 ACK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37307437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com