- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在研究 RabbitMq.net 和消息确认。如果消费者能够处理消息,您可以以
的形式发回确认channel.BasicAck(ea.DeliveryTag, false);
这会将其从队列中移除。
但是如果消息无法处理怎么办?也许是临时中断,您不希望从队列中取出的消息只是放在后面继续处理下一条消息?
我试过用
channel.BasicNack(ea.DeliveryTag, false, true);
但下一轮它仍然收到相同的消息,而不是移动到队列中的下一条消息
我的完整代码是
class Program
{
private static IModel channel;
private static QueueingBasicConsumer consumer;
private static IConnection Connection;
static void Main(string[] args)
{
Connection = GetRabbitMqConnection();
channel = Connection.CreateModel();
channel.BasicQos(0, 1, false);
consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("SMSQueue", false, consumer);
while (true)
{
if (!channel.IsOpen)
{
throw new Exception("Channel is closed");
}
var ea = consumer.Queue.Dequeue();
string jsonified = Encoding.UTF8.GetString(ea.Body);
var message = JsonConvert.DeserializeObject<SmsRecords>(jsonified);
if (ProcessMessage())
channel.BasicAck(ea.DeliveryTag, false);
else
channel.BasicNack(ea.DeliveryTag, false, true);
}
}
private static bool ProcessMessage()
{
return false;
}
public static IConnection GetRabbitMqConnection()
{
try
{
var connectionFactory = new ConnectionFactory
{
UserName = "guest",
Password = "guest",
HostName = "localhost"
};
return connectionFactory.CreateConnection();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
}
最佳答案
我的公司是这样做的:如果一条消息失败(出于任何原因),我们会将消息放入一个保持队列中并等待 10 秒钟,然后将其放回队列中以进行重试。我们最多执行此循环 10 次,如果消息被 nacked 10 次,那么我们认为这是一个我们无法恢复的故障,我们将其放入永久死信队列以进行调查。
这是示意图:
关于c# - Rabbitmq Ack 或 Nack,将消息留在队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28604332/
在消费者确认消息之前,消费者是否可以通过任何方式修改消息的状态,以便当消费者在重新传递时消费它时,它会看到已更改的状态。 我宁愿不拒绝 + 重新排队新消息,但如果这是完成此任务的唯一方法,请告诉我。
我有一个成功连接到 FCM XMPP 测试服务器的 python3 程序。但是,在发送 JSON 后,它每次都会返回一条 SERVICE_UNAVAILABLE nack 消息。同一段代码上周运行完美
这是我正在尝试做的事情: 出列消息 对消息执行操作 如果操作失败,将消息放回队列 如果操作成功,确认消息 我现在的问题是,如果操作失败,消息不会重新排队,但会保持未确认状态。如果我进入 RabbitM
我是 rabbitmq 的新手,我想知道在我可以确认该队列上的交付之前删除队列时处理错误的最佳方法是什么。 if err := handle(); err != nil { delivery.Na
我的经验:在发布/订阅场景中,如果订阅者 nacks 一条消息,则该 nacks 消息会立即在队列的前面重新排队,这将是订阅者获得的下一条消息。 有没有办法避免这种情况?是否有可能以一种下一条消息绝对
I2C 从机在向主机传输数据时是否允许 NACK? 从规范(2.1)来看,从设备在传输时(即从从设备向主设备发送数据)实际上无法向主设备发送 NACK。我已经在网上搜索过,但找不到任何帮助。为什么?我
我正在尝试使用 apache nms stomp 发送/接收消息。我不能使用 Transnational ack 模式,因为使用 hornetq。我的消费场景: 接收消息 处理消息 如果处理成功则确认
我想测试我的 Rabbitmq 实现。我有一个队列和一个消费者,我希望有第三个元素来监听/嗅探队列响应,因此如果队列响应 nack 或通过,则测试将失败。 你知道我该怎么做吗? 非常感谢 最佳答案 你
我们有两个对等点的 WebRTC 应用程序,当通话正在进行时,我遇到了大约 5% 的数据包丢失(在 webrtc-internals 上检查过)。我也看到了 Nacks。 想知道我的设置中是否实现了
我有一个关于 I2C 协议(protocol)的问题。我在维基百科页面上找到了这个。 “如果发送器看到一个 1 位 (NACK),它会了解到: 1) 从机无法接受数据。 2)没有这样的奴隶 3) 命令
我目前正在尝试通过消息代理 RabbitMQ 进行通信时可能发生的故障场景。目标是评估如何使此类沟通更具弹性。 特别是,我想在producer-commit mode中发送消息时触发nack(不确认)
我正在使用 修改 pika header properties.headers = { 'myheader': myheader } 但我正在使用 delivery_tag channel.
我一直在研究 RabbitMq.net 和消息确认。如果消费者能够处理消息,您可以以 的形式发回确认 channel.BasicAck(ea.DeliveryTag, false); 这会将其从队列中
Redis Pub/Sub 中有确认的概念吗? 例如,当使用 RabbitMQ 时,我可以让两个 worker 在不同的机器上运行,当我向队列发布一条消息时,只有一个 worker 会 ack/nac
我正在尝试将 STM32 编写为具有简单接口(interface)的 I2C 从设备,其工作原理如下: 所以master每次都会发送一个注册地址,然后从该注册地址写入或读取。 然后从机需要始终接收 1
我最近的项目需要使用 i2c 通信,使用单个主设备和多个从设备。我知道,对于主机发送的每个数据字节(实际数据),从机以 Nack\Ack(1,0) 响应。 我对如何解释 Nack 和 ACK 感到困惑
channel.basicQos(1); while (true) { GetResponse res = channel.basicGet(TEST_QUEUE, false); i
如果我的问题看起来很幼稚,我是新手,很抱歉。 我有一个接收 hl7 消息的欢乐 channel ,这很好,而且我在 Source 和 Destination 中都有一些过滤器和转换器。 当目的地结束时
否定确认的行为是将接收到的消息的可见性超时更改为 0。在为 JMS 创建 SQS Factory 时,NACK_TIMEOUT 的值不可配置。 https://github.com/awslabs/a
有没有办法配置拉取订阅,使导致错误并nacked的消息重新排队(并重新传递)不超过n次? 理想情况下,如果最后一次处理也失败,我想处理这种情况(例如,记录此消息被放弃处理并将被删除)。 或者可能可以找
我是一名优秀的程序员,十分优秀!