2017-11-07 5 views
0

Ich benutze RabbitMQ, um einige Nachrichten in einer Warteschlange zu bekommen. Einer nach dem anderen. Dies ist ein Ausschnitt aus meinem Code:Wie benutze ich Ack in RabbitMQ für C#?

var data = channel.BasicGet(queue, true); 
     if (data != null) 
      message = System.Text.Encoding.UTF8.GetString(data.Body); 
     else 
      message = ""; 
     return message; 

Aber ich möchte wissen, wie die Ack Eigenschaft zu benutzen? Wie kann ich die gelesene Nachricht bestätigen/löschen?

Danke!

+1

Haben Sie [die Dokumentation] (https://www.rabbitmq.com/dotnet-api-guide.html)? Der zweite Parameter von 'BasicGet' gibt an, ob automatisch bestätigt werden soll. Wenn Sie es auf 'false' setzen, können Sie' channel.BasicAck' aufrufen, um dies zu bestätigen. –

Antwort

0

Von the Docs:

Da Noack = oben falsch, müssen Sie auch IModel.BasicAck rufen zu bestätigen, dass Sie erfolgreich erhalten haben, und die Nachricht verarbeitet:

dh zwei verschiedene Optionen mit BasicGet

mit noAck wahr

channel.BasicGet(queue, true); 

Auf diese Weise müssen Sie die Nachricht nicht quittieren - die Nachricht wird nach der BasicGet aus der Warteschlange entfernt. Diese Verwendung wird normalerweise für Nachrichten mit geringem Wert verwendet. Wenn die Verarbeitung nach BasicGet fehlschlägt, wird die Nachricht gelöscht.

Oder mit noAck false:

var result = channel.BasicGet(queue, false); 
// Process the message here ... e.g. save to DB 
// If the processing succeeds, Ack to remove the message 
channel.BasicAck(result.DeliveryTag, false); 

Diese zweite Option wäre für wichtige Nachrichten verwendet werden, wo Verlust einer Nachricht keine Option ist. Wenn Ihr Prozess abstürzt und die Nachricht nicht bestätigt werden kann, wird die Nachricht an die Warteschlange zurückgegeben.