[英]Is there a timeout for acking RabbitMQ messages?
我想設置一個超時,在此之后出隊的消息會自動 NACK。
當我將消息出列時,我會等到它通過套接字傳輸並且另一方確認其接收。
我需要保留一個計時器列表還是 RMQ 可以自動處理?
private void Run()
{
_rmqConnection = _queueConnectionFactory.CreateFactory().CreateConnection();
_rmqReadchannel = _rmqConnection.CreateModel();
_rmqReadchannel.QueueDeclare(QueueIdOutgoing(), true, false, false, null);
_rmqReadchannel.BasicQos(0, 1, false);
var consumer = new QueueingBasicConsumer(_rmqReadchannel);
_rmqReadchannel.BasicConsume(QueueIdOutgoing(), false, consumer);
while (true)
{
if (!_rmqReadchannel.IsOpen)
{
throw new Exception("Channel is closed");
}
var ea = consumer.Queue.Dequeue();
string jsonData = Encoding.UTF8.GetString(ea.Body);
if (OnOutgoingMessageReady != null)
{
OnOutgoingMessageReady(this, new QueueDataEventArgs(jsonData, ea.DeliveryTag));
}
//waiting for ACK from a different thread
}
}
RabbitMQ 不提供任何類型的用於確認消息的超時機制。 這在官方 Python 教程中有討論:
沒有任何消息超時; RabbitMQ 只會在工作連接斷開時重新傳遞消息。 即使處理消息需要非常非常長的時間也沒關系。
AMQP 0-9-1 規范的第 3.1.8 節描述了確認,並且非常清楚它們可以是自動的(客戶端不必做任何事情,消息一傳遞就被確認)或顯式(客戶端必須對其處理的每條消息或消息組進行確認)。
所以:是的,如果您需要超時以在一段時間后自動發送 NACK,您必須自己這樣做。
RabbitMQ 的現代版本有ack timeout 。 因此,如果您的消費者在交付確認之前花費了大量時間,請小心更新新版本。
如果消費者未確認其交付超過超時值(默認為 15 分鍾),則其通道將關閉,並顯示 PRECONDITION_FAILED 通道異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.