Ich habe, was ich glaube, ein häufiger Anwendungsfall mit RabbitMQ: Worker Queues - Ein Server bekommt Anfragen von Benutzern und speichert sie in einer Warteschlange, um später zu behandeln. Das Problem ist, dass einige der Aufgabe zu einer Minute dauern kann, und so habe ich beschlossen, nicht Auto ack:Rabbitmq - Wie man mit Kanälen umgeht, wenn Nachrichten nicht automatisch gelöscht werden
GetResponse response = channel.basicGet(queueName, false);
I ack wollen, wenn die Arbeit beendet hat
channel.basicAck(deliveryTag, false);
Von dem, was ich weiß, : https://www.rabbitmq.com/confirms.html ("Senden einer basic.ack auf demselben Kanal" - Bestätigung sollte auf dem gleichen Kanal erfolgen, der die Nachricht empfangen hat).
Also entschied ich mich für eine Karte von Nachrichten an Kanäle (In meinem Anwendungsfall habe ich einen einzigen Kanal pro Nachricht). Jedes Mal, wenn die Nachricht fertig ist, antworte ich.
Ich denke, dieses Design ist sehr fehlerhaft. Es zwingt mich, einen Zustand in meinem Server zu speichern, und zwingt mich, einen Kanal pro Nachricht zu haben, anstatt Kanäle wiederzuverwenden.
Ich bin mir sicher, dass dies ein weit verbreiteter Anwendungsfall ist - was wäre: 1. Sollte ich lokale Threadkanäle verwenden? Wenn ja, ist es in Ordnung, Nachrichten in einem anderen Thread zu beantworten? 2. Gibt es eine bessere Möglichkeit, acking-Nachrichten zu verarbeiten als diese Nachricht zu speichern -> channel map?
Danke
Und wenn das Kanalobjekt verbraucht war irgendwie geschlossen ist, kann ich es wieder öffnen - mit connection.createChannel (Kanalnummer) - und ack es auf diesem Kanal ? – user967710
Und auch - sind Kanäle nie geschlossen? – user967710