# JMS Queue vs. Topic



## mavinatic (15. Aug 2011)

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 (15. Aug 2011)

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 (15. Aug 2011)

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 (15. Aug 2011)

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.


----------



## mavinatic (15. Aug 2011)

Sinn und Zweck ist es ja nicht für andere Programme die Informationen wegzunehmen.


----------



## mvitz (15. Aug 2011)

Deswegen sollte man dann für so einen Fall eben ein Topic nehmen =)


----------



## mavinatic (15. Aug 2011)

Ich hab halt mal gelesen, dass da oft Point-to-Point genommen wird, deswegen hm...okay p2p


----------



## FArt (17. Aug 2011)

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 (17. Aug 2011)

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:

```
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?


----------



## mvitz (17. Aug 2011)

Indem du (wie in deinem oben geposteten Tutorial [Stichwort: Queue-Listener]) dich als Listener registrierst.


----------



## Niki (17. Aug 2011)

sollte das warten auf eine nachricht nicht blockieren bis eine nachricht empfangen worden ist?


----------

