2017-10-15 7 views
0

Ich habe eine Reihe von Computern, die einige Aktionen ausführen können. Um eine Aktion zu initiieren, möchte ich eine Nachricht an eine Warteschlange senden, die beispielsweise von der Rechner-ID "12345" benannt wird.Senden von Nachrichten an die exklusive Warteschlange mit AMQP/RabbitMQ

Um zu vermeiden, dass jemand anderes diese Nachrichten konsumiert, sollte die Warteschlange exklusiv sein, denke ich.

Aber von meinem Controller kann ich die Warteschlange nicht geltend machen, wenn sie auf dem Rechner, der sie verbraucht, als exklusiv erklärt wird. Ich kann jedoch in die Warteschlange senden, indem ich seinen Namen festlege, ohne zu behaupten, aber ich denke, das ist eine schlechte Übung?

Die Maschine ist für Befehle wie diese hört:

ch.assertQueue(machineID, {exclusive: true, durable: false}, function (err, q) { 
    if (err) console.log(err) 
    console.log("opened queue") 
    ch.consume(q.queue, function (message) { 
     console.log(message.content.toString()) 
    }) 
}) 

Wenn ich an die Warteschlange senden, wird es aufgrund exklusive Fragen scheitern, an dieser Linie im Client:

ch.assertQueue(machineID, {}) 

Aber Es wird die Nachricht senden, wenn ich die Zeile oben kommentiere.

ch.sendToQueue(machineID, new Buffer(id.toString())) 

Was ist der eleganteste Weg, um dies zu umgehen?

+0

Könnten Sie bitte die Fehlermeldung veröffentlichen? –

+0

405) RESOURCE_LOCKED - kann keinen exklusiven Zugriff auf gesperrte Warteschlange erhalten –

+0

Exklusive Warteschlange bedeutet, dass Sie nicht mehr als einen Verbraucher haben können. Wenn Sie wissen, dass die Warteschlange immer vom Benutzer erstellt werden soll, muss sie nicht jedes Mal neu erstellt werden, wenn Sie eine Nachricht senden möchten (es ist besser, am Anfang eine Warteschlange zu erstellen). Ein mögliches Problem ist, dass die Warteschlange mit verschiedenen Parametern '{exclusive: true, durable: false}' und '{}' (standardmäßig exclusive ist false) definiert ist und normalerweise fehlschlägt - die Parameter sollten identisch sein. –

Antwort

0

Eine Möglichkeit besteht darin, einen Austausch vom Typ 'direkt' zu erstellen und die Warteschlange an diesen Austausch zu binden. Wenn Sie also eine Nachricht an diese Vermittlungsstelle übergeben, wird sie nur an diese Warteschlange weitergeleitet, deren Name mit dem Routing-Schlüssel identisch ist, den Sie an die Vermittlungsstelle übergeben. Beispielsweise werden alle Nachrichten mit dem Routing-Schlüssel "12345" von einer solchen Vermittlungsstelle an die Warteschlange mit der Bezeichnung "12345" weitergeleitet.

Verwandte Themen