2014-02-28 10 views
12

Nach dem Lesen eines Dokuments von JMS, ich völlig verwirrt durch die Phrase synchronous und asynchronouns.Wie versteht man das "synchrone" und "asynchrone" Messaging in JMS?

Sehen Sie diese Seite: http://docs.oracle.com/cd/E19798-01/821-1841/bncdq/index.html

Synchrone

Sie die Methode erhalten verwenden synchron eine Nachricht zu konsumieren. Sie können diese Methode jederzeit verwenden, nachdem Sie die Start-Methode aufrufen:

connection.start(); 
Message m = consumer.receive(); 
connection.start(); 
Message m = consumer.receive(1000); // time out after a second 

Um eine Nachricht asynchron zu verbrauchen, verwenden Sie eine Nachricht Hörer, im nächsten Abschnitt beschrieben.

Asynchronous

JMS Nachricht Hörer Eine Nachricht Hörer ist ein Objekt, das für Nachrichten als asynchrones Event-Handler fungiert. Dieses Objekt implementiert die MessageListener-Schnittstelle, die eine Methode onMessage enthält. In der onMessage-Methode definieren Sie die Aktionen, die beim Eintreffen einer Nachricht ausgeführt werden sollen.

Sie registrieren den Nachrichten-Listener mit einem bestimmten MessageConsumer, indem Sie die setMessageListener-Methode verwenden. Zum Beispiel, wenn Sie eine Klasse mit dem Namen Listener definieren, die die Message-Schnittstelle implementiert, können Sie die Nachrichten-Listener registrieren, wie folgt:

Listener myListener = new Listener(); 
consumer.setMessageListener(myListener); 

Ich habe zwei Fragen:

  1. Als das, was ich verstanden , die Art von JMS ist asynchron. Producer veröffentlicht Nachrichten an die Warteschlange/das Thema, es muss nicht auf den Consumer warten. Dies ist asynchrones Verhalten. Wie kann es "synchron" sein?

  2. Wenn der "MessageListener" asynchron ist, aber in meinem Test mit Spring-Jms, fand ich es immer in einem Thread ausgeführt. Das heißt, wenn ich Thread.sleep(2000) in onMessage schreibe, muss es 2 Sekunden warten, bevor die nächste Nachricht verarbeitet wird. Ist es "asynchron"?

Antwort

12

Wenn Sie es besser so verstehen, consumer.receive() verwendet ein Pull Modell: Sie aus einer Warteschlange gelesen und blockiert auf diese Nachricht zu warten, bis er kommt, oder ein Timeout abgelaufen ist.

Verwenden eines Listeners verwendet ein Push Modell: Sie registrieren einen Listener, und wenn eine Nachricht kommt, wird der Listener in einem separaten Thread aufgerufen.

Alles ist in einem Thread in Java getan, und der Listener-Aufruf ist keine Ausnahme. Ob die Listener-Verarbeitung die Verarbeitung anderer Nachrichten in der Warteschlange verhindert, hängt davon ab, wie viele Threads für die Nachrichtenverarbeitung reserviert sind. Wenn Sie Spring so konfigurieren, dass ein Pool mit 5 Threads für die asynchrone Verarbeitung von Nachrichten verwendet wird, können 5 Listener Nachrichten parallel verarbeiten.

+0

Danke für die "pull" und "push" Erklärung! – Freewind

5

Wie ich verstehe diese:

asynchron - Message: Verwenden Sie diese auf einem Server, der in eine Warteschlange hört. Wenn eine Nachricht eintrifft, müssen Sie sofort damit umgehen. Der Server überwacht diese Warteschlange.

synchrone - consumer.receive (1000): Verwenden Sie dies auf einem Client-Anwendungen, die hin und wieder überprüfen müssen, ob eine Nachricht für diesen Client beabsichtigt ist. Beispiel: Umfrage alle 60 Sekunden. Dies öffnet nur in Kürze eine Verbindung zum Server. Die 1000 Millisekunden halten diese Verbindung offen. Wenn eine Meldung innerhalb dieser 1000 Millisekunden ankommt, dann wird die Nachricht verbraucht und die Verbindung geschlossen wird.

2

Sie betrachten es Ende-zu-Ende: vom Herausgeber zum Verbraucher. Ja, es handelt sich um eine asynchrone Zustellung vom Publisher zum Verbraucher, unabhängig vom Sync/Async-Konsumenten. Sync/Async in Ihrer Frage ist jedoch nur für Verbraucher, d. H. Vom JMS-Broker (zB: ApacheMQ) zum Verbraucher. Wie andere bereits erwähnt haben, ziehen Sync-Consumer Nachrichten sequentiell vom Broker und warten auf Nachrichten. Async Verbraucher registrieren einen Rückruf, wenn Nachrichten an sie gedrückt (onMessage). Asynchrone Benutzer können andere Dinge tun, während diese Nachrichten asynchron vom JMS-Broker an sie gesendet werden.

Verwandte Themen