webentwicklung-frage-antwort-db.com.de

Wie funktioniert JMS Receive intern?

Ich habe verschiedene Kommunikationstechnologienarchitekturen/-muster/-implementierungen (sprich: Schlagworte) untersucht, darunter Webdienste (WCF, Axis2), ESBs und SOA, und wollte mehr über JMS in Bezug auf Messaging erfahren.

Konzeptionell klingt JMS einfach. Meiner Meinung nach handelt es sich um einen Zwischenhändler, der Nachrichten von Publishern verwaltet und an geeignete Abonnenten weiterleitet. Dazu werden Nachrichten beim Veröffentlichen in die Warteschlange gestellt und beim Empfang aus der Warteschlange entfernt.

/ - Frage 1: Ist mein Grundverständnis von JMS richtig?

Eines der Dinge, die mich beim Lesen von Technologien stören, ist, wenn eine bestimmte (beabsichtigte oder unbeabsichtigte) Handbewegung über eine Funktion ausgeführt wird.

Nach meinem Grundverständnis muss ein JMS-Provider ausgeführt werden, um Nachrichten senden oder empfangen zu können. Beim Veröffentlichen gehe ich davon aus, dass der JMS-Anbieter einfach wartet, bis eine Nachricht veröffentlicht wurde, und sie dann in einer Warteschlange speichert (speicher- oder datenbankgestützt, je nach Implementierung). Allerdings bin ich mir nicht ganz sicher, wie der Empfang funktioniert.

Frage 2: Empfängt (in der Regel) blockieren, wenn keine Nachrichten verfügbar sind?

Frage 2b: Wenn ja, wie wird die Blockierung erreicht? Fragt der Client kontinuierlich nach Nachrichten ab? Reagiert der Server einfach erst, wenn eine Nachricht veröffentlicht wurde (wie funktioniert das ohne Zeitüberschreitung?) Initiiert der Anbieter einen Anruf beim Empfänger?

Frage 2c: Wenn nicht, wie kann man sicherstellen, dass Nachrichten rechtzeitig empfangen werden, ohne die Leistung zu beeinträchtigen?

Die grundlegende Beschreibung scheint sich an einen einzelnen JMS-Anbieter zu lehnen, um sicherzustellen, dass Nachrichten zentral verwaltet werden und nicht verloren gehen. Ich sehe, dass die Skalierung ein Problem darstellt.

Frage 3: Wie skaliert JMS?

Bei der Skalierung kann ich feststellen, dass Komplexitäten auftreten, die sicherstellen, dass eine einzelne Nachricht an alle entsprechenden Abonnenten übermittelt wird, unabhängig davon, auf welchem ​​physischen Server die Nachricht empfangen wird.

Frage 3b: Wie stellt eine JMS-Implementierung eine zuverlässige Bereitstellung in einer skalierten Umgebung sicher?

Beachten Sie, dass diese Fragen sich zwar auf JMS beziehen, jedoch wahrscheinlich auf jede Messaging-Infrastruktur zutreffen. Ich begrüße sowohl JMS-spezifische als auch allgemeinere oder sogar spezifischere Antworten.

33
Travis

Ich versuche, einige Fragen aufgrund meiner Erfahrung mit JMS zu beantworten.

Antwort 1: - JMS ist Java Message Service API; Es bietet eine einheitliche Schnittstelle für Java-Clients für den Zugriff auf das Messaging-Framework. Unter JMS-API ist ein JMS-kompatibler Messaging-Provider, z. B. der WebSphere MQ-Provider. JMS unterstützt den Transport einer Nutzlast über ein beliebiges Messaging-Protokoll zu Zielen, z. Warteschlange und Thema. Dies sind Grundlagen von JMS.

Wie erhält man Arbeit? Die JMS-Spezifikation bietet zwei wichtige Klassen: - MessageConsumer und MessageListener. Die Klasse MessageConsumer ermöglicht einem JMS-Client den synchronen Empfang von JMS-Nachrichten, indem eine seiner receive()-Methoden aufgerufen wird. Dieser Aufruf blockiert den Thread, bis eine Nachricht empfangen wird. Andernfalls kann ein asynchroner Empfang durch Registrieren eines Objekts von MessageListener mit MessageConsumer. Erfolgen. JMSProvider erkennt, dass eine Nachricht eingegangen ist In seinem lokalen Ziel und seiner Aufgabe ist es, Nachrichten entweder an den Abfragemeldungs-Consumer-Thread oder den nicht abrufenden registrierten Message-Listener-Thread zu übermitteln.

Antwort 2: - MessageConsumer API hat zwei Varianten von receive: receive() und receive(long timeout). Die letztere Variante lässt den MessageConsumer-Threadblock blockieren, bis die Nachricht innerhalb eines bestimmten Zeitlimits ankommt oder das Zeitlimit überschritten wird.

Unterschiedliche Messaging-Frameworks können Blockierungsfunktionen auf unterschiedliche Weise implementieren. Da JMS-Objekte von JNDI verwaltete Objekte sind und anbieterspezifische Proxy-Objekte an den JMS-Client zurückgegeben werden, bedeutet dies, dass der Client nicht weiß, wie die Blockierung im Hintergrund erfolgt. Ein bestimmtes Messaging-Framework kann nach einem bestimmten Zeitraum eine Nachrichten-Consumer-Thread-Abfrage auswählen. Alternativ kann es blockieren, bis die Benachrichtigung gesendet wird.

Ich bin nicht sicher, ob Sie nach einem bestimmten JMS-kompatiblen Messaging-Framework suchen.

Antwort 3: - Ich meine, mit JMS-Skalierung meinen Sie die Fähigkeit, viele Publisher/Abonnenten und viele Ziele auf mehreren physischen Maschinen zu haben. Die JMS-Skalierung erfordert die Unterstützung des zugrunde liegenden Messaging-Providers, um eine Art Clustering/Failover zu unterstützen. Daher unterstützt die JMS-Spezifikation keine Skalierbarkeit. Korrigieren Sie mich, wenn ich falsch liege? Ich habe zum Beispiel an JMS-kompatiblem WebSphere MQ gearbeitet, das Clusterunterstützung bietet.

19
ag112

Frage 1: Ist mein grundlegendes Verständnis von JMS richtig?

Lassen Sie uns zuerst die Terminologien richtig machen. Sie können nicht JMS Provider must be running sagen, da Provider eine Entität ist, die den JMS-Server erstellt hat und der JMS-Server ausgeführt werden muss. Wenn wir also JMS sagen, meinen wir eine Reihe von APIs (technischeren Schnittstellen), die von Anbietern implementiert werden. Im Grunde schreiben Anbieter ihre eigene JMS-Implementierung. Beispiel: Active MQ is a JMS server, der von Apache(provider) bereitgestellt wird

Bei der Veröffentlichung gehe ich davon aus, dass der JMS-Provider einfach wartet, bis eine Nachricht veröffentlicht wird, und diese dann in einer Warteschlange speichert (je nach Implementierung speicher- oder datenbankgestützt).

Bis zu einem gewissen Grad. Es gibt verschiedene Modelle, die befolgt werden. Der JMS-Server hält einen Socket offen. Immer wenn ein Absender-Client eine Nachricht senden muss, stellt er einfach eine Verbindung zum Socket her und sendet die Nachricht. Wie sich das Empfangen verhält, ist völlig anders. Sie haben pull und Push . In Push-Server werden die Nachrichten an den Live-Empfänger-Client gesendet, sobald er eine Nachricht empfängt. Dies wird auch als asynchroner Modus bezeichnet. Im Pull-Modell sendet der Clientempfänger eine Anforderung an den Server, um Nachrichten abzurufen ( synchroner Modus ).

Empfängt (normalerweise) eine Sperre, wenn keine Nachrichten verfügbar sind?

Wie ich bereits erwähnt habe, hängt es vom verwendeten Modell ab. Der Empfänger wird im Pull-Modell blockiert ( synchroner Empfang ). Dies geschieht auch in Session-Thread , nicht im Haupt-Thread. 

Wenn ja, wie wird die Blockierung erreicht? Fragt der Client kontinuierlich nach Nachrichten ab?

Ja, der Client wird bei einem Pull-Modell kontinuierlich abfragen. Im Allgemeinen gibt es ein Timeout, nach dem der Client beendet wird.

Wenn nicht, wie kann sichergestellt werden, dass Nachrichten rechtzeitig empfangen werden, ohne die Leistung zu beeinträchtigen?

Verwenden Sie asynchroner Modus . Sie müssen lediglich ein MessageListener registrieren, und es wird eine Nachricht von onMessage (Message msg) empfangen, wenn Nachrichten auf dem Server verfügbar sind. 

Frage 3: Wie skaliert JMS?

Es ist wirklich eine Frage für die Anbieter, sich Sorgen zu machen. Wenn Sie sagen, dass eine Nachricht von allen Teilnehmern empfangen wird, beziehen Sie sich aufPUBSUBKommunikationsmodell (anderes WesenPTP). In PUBSUB wird eine an ein Thema gesendete Nachricht an alle Abonnenten gesendet, die dieses Thema abonniert haben.

Frage 3b: Wie gewährleistet eine JMS-Implementierung eine zuverlässige Bereitstellung in einer skalierten Umgebung?

Zuverlässigkeit? Nicht immer. Dies hängt wiederum vom Anwendungsfall ab. Sie können persistent sowie nicht persistent Nachrichten haben. Bei persistenten Nachrichten werden Nachrichten in der DB (Datei oder andere) gespeichert und die Zustellung sichergestellt. Bei nicht persistenten Nachrichten gibt es keine Garantie. Serverfehler können zu Nachrichtenverlust führen.

5
Aniket Thakur

Ich denke, der Unterschied zwischen Warteschlange und Thema sollte erwähnt werden, da es wichtige Unterschiede in der Art und Weise gibt, wie Nachrichten übermittelt werden.

Warteschlange: Nur ein Client erhält eine Nachricht. Zum Skalieren können Sie beispielsweise 10 Clients mit derselben Warteschlange verbunden haben - aber nur einer von ihnen erhält eine bestimmte Nachricht. Wenn keine Clients verbunden sind, bleibt die Nachricht in der Warteschlange, bis eine Verbindung hergestellt wird oder die Nachricht abläuft.

Thema: Alle Kunden erhalten eine Kopie jeder Nachricht. Wird normalerweise in einem Abonnentenszenario verwendet, in dem viele Endpunkte potenziell an jeder Nachricht interessiert sind. Ein dauerhafter Abonnent kann sogar eine Weile ausfallen. Die Nachricht wird aufbewahrt, bis der Teilnehmer wieder aktiv ist oder die Nachricht abläuft. Wenn keine Clients verbunden sind und keine dauerhaften Abonnenten vorhanden sind, wird die Nachricht gelöscht.

2
Simen R

JMS unterstützt die Verwendung von Nachrichten mit einer synchronen Methode (Empfangen mit und ohne Blockierung des Threads durch Timeout) oder mit einem ereignisgesteuerten Rückruf (asynchroner Nachrichtenlistener).

Sie können entscheiden, welche Methode Ihren Anforderungen besser entspricht, aber Sie müssen möglicherweise auch die tatsächliche Implementierung überprüfen. Zum Beispiel führen einige JMS-Implementierungen einen Netzwerk-Roundtrip für das receive () durch und werden daher besser mit einem Timeout oder mit dem Listener verwendet.

Mit dem Message-Listener-Thread lassen sich das Verhalten und das Anhalten des Message-Empfangs nicht so einfach steuern wie mit einem blockierenden Empfangsaufruf. Normalerweise wird die meiste Kontrolle durch einen eigenen Pool aus blockierten receive () - Aufrufen mit Zeitüberschreitungen erzielt, der an Ihre Mitarbeiter gesendet wird.

2
eckes

In JMS gibt es zwei Arten von Messaging-Domänen.

  1. Point -To -Point (PTP) Messaging-Domäne
  2. Publisher/Subscriber Messaging-Domäne 

Beim PTP-Modell wird eine Nachricht nur an einen Empfänger gesendet. Die Warteschlange wird hier als aMessageOrientedMiddleware (MOM) verwendet.

Die Warteschlange ist dafür verantwortlich, die Nachricht aufzubewahren, bis der Empfänger bereit ist.

Im PTP-Modell gibt es keine zeitliche Abhängigkeit zwischen Sender und Empfänger.

 enter image description here


Im Pub/Sub-Modell wird eine Nachricht an alle Abonnenten gesendet. Es ist wie im Rundfunk. Topic wird hier als nachrichtenorientierte Middleware verwendet, die für das Halten und Liefern von Nachrichten verantwortlich ist.

Im PTP-Modell gibt es eine zeitliche Abhängigkeit zwischen Herausgeber und Abonnent.

 enter image description here


JMS-Programmiermodell

 enter image description here

Quelle


MessageDRivenBean (MDB) 

  • MDB ist eine Bean, die Geschäftslogik enthält. Sie wird jedoch durch Weiterleiten der Nachricht aufgerufen. Es ist also wie ein JMS-Receiver.
  • Die MDB empfängt asynchron eine Nachricht und verarbeitet sie.
  • MDB empfängt Nachricht aus Warteschlange oder Thema. 
  • MDB ist wie ein statusloses Session-Bean, das eine Geschäftslogik einkapselt und den Bean-Status nicht aufrechterhält.

 enter image description here

0
Premraj