这个问题已经exists并且已经回答。但是答案中有阴暗面。我的频道已经支持BasicAcks
和BasicNacks
处理程序(效果不佳):
Channel.BasicAcks += (sender, eventArgs) =>
{
Console.WriteLine("Basic Ack!");
}
Channel.BasicNacks += (sender, eventArgs) =>
{
Console.WriteLine("Basic Nack!");
}
我有一条消息已发布到队列中。所以我用下面的代码来做到这一点:
Channel.BasicPublish("ExchangeName", "QueueName", messageProperties, payload);
Channel.WaitForConfirmOrDie();
只要WaitForConfirmOrDie
是一个void函数,如何知道队列是否接收到消息?或更精确地说,如何实现Ack
处理程序以使我清楚地了解已发布的消息,以便不再将其再次发送到队列中,或者在BasicNack
的情况下再次发送给我?
答案 0 :(得分:2)
使用BasicAcks
和BasicNacks
事件处理程序与调用Channel.WaitForConfirmOrDie
无关。
Channel.WaitForConfirmOrDie
是一种方便的方法,它同步等待消息确认。因此,如果您一一发布消息,则将一一等待这些提示。可以想象,这效率很低。
您应该做的就是像已完成的那样注册BasicAcks
和BasicNacks
。您应该定义“可接受的未完成确认数”。这是实现此目的的一种方法-
N
条消息,不加确认/不确认(N
由您决定)。如果下一封邮件超过N
,请不要继续发布邮件。