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?
Könnten Sie bitte die Fehlermeldung veröffentlichen? –
405) RESOURCE_LOCKED - kann keinen exklusiven Zugriff auf gesperrte Warteschlange erhalten –
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. –