AMQP erstellt das dynamische Abonnieren von Warteschlangen

8

Ich versuche eine einfache Chat-Anwendung mit AMQP, Websockets und Ruby zu erstellen. Ich verstehe, dass dies nicht der beste Anwendungsfall ist, um AMQP zu verstehen, aber ich würde gerne verstehen, wo ich falsch liege.

Der folgende Code ist mein amqp-server

%Vor%

Ich verwende den Status, um anzuzeigen, ob die eingehende Nachricht eine Nachricht für einen fortlaufenden Chat oder für eine Statusnachricht ist, die es erfordert, dass ich Aufgaben wie Abonnieren in der Warteschlange behandle.

Das Problem, dem ich gegenüberstehe, ist, dass wenn ich eine Nachricht wie z socket.send(JSON.stringify({status:'message', message:'test', roomname:'Harry Potter'}))

Die exchange.publish' is called but it still doesn't get pushed via the ws.send 'an den Browser.

Gibt es etwas grundlegend falsches mit meinem Verständnis von EventMachine und AMQP?

Hier ist der Pastie für den gleichen Code Ссылка

Mein Code scheint wie gewünscht zu funktionieren, wenn ich durable => true von queue = channel.queue(status[:username], :durable => true)

entferne

Das folgende ist ein Ausschnitt meiner Rails-Ansicht, der den Benutzernamen und den Raumnamen des Benutzers identifiziert und als Teil der Nachricht über WebSockets sendet.

Obwohl der Code zu funktionieren scheint, wenn ich durable => true entferne, verstehe ich nicht, warum das die Nachricht betrifft, die geliefert wird. Bitte ignoriere den Mongo-Teil, da er noch keine Rolle spielt.

Ich würde auch gerne wissen, ob meine Herangehensweise an AMQP und seine Verwendung korrekt ist

%Vor%     
Sid 19.07.2011, 12:21
quelle

2 Antworten

1

Ich denke, Ihr Problem könnte sein, dass die Warteschlange zwischen den Aufrufen von ws.onmessage auf dem Broker herumhängt. Wenn der Client die Warteschlange erneut verbindet und die Bindung bereits besteht, wird ws.send () nicht aufgerufen.

Wenn Sie eine Warteschlange erstellen, bleibt sie und alle Bindungen, die sie enthält, standardmäßig so lange hängen, bis der Broker neu gestartet wird, oder Sie weisen den Broker ausdrücklich an, ihn zu löschen.

Es gibt zwei Möglichkeiten, dies zu ändern:

  • Beim Erstellen der Warteschlange wird das durable -Flag hinzugefügt, wodurch die Warteschlange auch dann beibehalten wird, wenn der Broker neu gestartet wird
  • Hinzufügen des auto_delete -Flags, das dazu führt, dass der Broker die Entität nach einer kurzen Zeitspanne automatisch löscht, wenn kein Verbraucher an ihn angehängt ist

Wenn Sie die Kontrolle über den Broker haben, den Sie mit dem rabbitmq-Broker verwenden, können Sie auf einfache Weise überprüfen, was auf dem Broker geschieht: Management-Plugin , das eine Web-Schnittstelle für Börsen, Bindungen und Warteschlangen auf dem Broker bereitstellt.

    
alanxz 25.10.2011, 17:54
quelle
0

Auf den ersten Blick scheinen die AMQP-Bits in Ordnung zu sein, aber ich möchte nicht alle Abhängigkeiten einrichten. Wenn Sie ein minimales Beispiel nur mit dem AMQP-Teil angeben, werde ich es überprüfen.

    
botanicus 19.07.2011 13:15
quelle

Tags und Links