JMS Queue vs. Topic

mavinatic

Bekanntes Mitglied
Hallo Community,

ich habe eine Frage zum Thema: "JMS - Java Message Service". Mein Problem ist das Verständnis zwischen den beiden Nachrichtenkanälen (Queue und Topic).

Bei Topic wird an eine Masse X gesendet, hingegen bei Queue immer an einen Client. Soweit so gut! Ich habe mir folgendes Tutorial angeguckt und festgestellt, dass es außer die Variablennamen keinen unterschied in der Programmierweise/Programm besteht. Worin unterscheidet es sich dann? Der Code ist fast identisch aber irgendwie sind es 2 verschiedene Nachrichtenkanäle.

Link zum Tutorial: JMS Tutorial
 

mvitz

Top Contributor
Bei den Beispielen sieht man in der Tat keinen Unterschied. Rein programmatisch sieht auch beides gleich aus, der Unterschied ist eben nur, dass bei einer Queue die reingesteckte Nachricht eben von genau einem Receiver bearbeitet wird, bei einem Topic jedoch, kann man mehrere Receiver anmelden und eine Nachricht würde dann potentiell mehrfach verarbeitet werden können (z.B. einer der was in eine DB schreibt und ein weiterer, der eine Mail sendet).
 

mavinatic

Bekanntes Mitglied
Danke für die Erklärung, soweit verstehe ich es, aber was passiert wenn ich in einer Queue in mehreren Programmen verschiedene Reciever hinzufüge? Exception?

Und noch eine Fragen: Ich habe gelesen, dass in einem ESB eine Point-to-Point Verbindung besteht, wie erreiche ich dass verschiedene Services(Reciever) immer nur über einen Sender verfügen?
 

mvitz

Top Contributor
Probier es doch einfach aus :) Bin jetzt auch nicht so der Experte, was JMS angeht, aber ich würde vermuten, wenn du mehrere Receiver auf eine Queue setzt, dann bekommt einer die Nachricht und die anderen gehen eben leer aus, d.h. die anderen Programmen arbeiten unter Umständen nicht mehr richtig.

Zu der zweiten Frage, keine Ahnung.
 

FArt

Top Contributor
Aus einer Queue können sich gerne auch mehrere Receiver bedienen. So kann man z.B. Aufträge, parallel verarbeiten lassen. Aber es ist sichergestellt, dass jeder Auftrag genau einmal verarbeitet wird.

Bei einem Topic ist das anders. Da interessieren sich mehrere Receiver für die gleiche Message. Damit kann man z.B. einen Eventmechanismus realisieren.

Von der Verwendung unterscheiden sich beide nicht. Es geht um Message empfangen, verarbeiten, bestätigen, ...
 

mavinatic

Bekanntes Mitglied
Ich hab nun eine spezifische Frage noch, zum abrufen der Nachrichten:

Ich möchte umgehen, dass ich eine while-Endlosschleife einbauen muss, wie es in den meisten Beispielen ist:

In dieser Methode werden von JMS alle nachrichten verarbeitet:
Java:
public void processMessages() 
	{
		while(true) 
		{
			try 
			{
				ESBMessage msg = adapter.nextMessage(); //Gibt nächste Nachricht zurück
				
				if(msg!=null) //Wenn keine Nachrichten vorhanden sind => Abfrage auf NULL
				{
					
				}
				
				adapter.acknowledge(msg); //Acknowledging der Nachricht
				Thread.sleep(5000); // 5sek warten
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

Gibt es eine bessere Lösung alle 5Sekunden nach JMS-Nachrichten zuschauen?
 

Ähnliche Java Themen


Oben