Java Message Service


Java Message Service

Java Message Service (JMS) ist eine Programmierschnittstelle (API) für die Ansteuerung einer Message Oriented Middleware (MOM) zum Senden und Empfangen von Nachrichten aus einem Client heraus, der in der Programmiersprache Java geschrieben ist. JMS hat das Ziel, lose gekoppelte, verlässliche und asynchrone Kommunikation zwischen den Komponenten einer verteilten Anwendung zu ermöglichen.[1]

JMS ist Teil der Java Platform, Enterprise Edition, die Spezifikation des Dienstes sowie die zugehörige API wurden durch den Java Community Process im Rahmen des JSR 914 genormt. Die aktuelle Version von JMS ist die Version 1.1 vom 18. März 2002.[2]

Für die Anwendung braucht man einen Provider, der die API umsetzt und somit den Dienst bereitstellt. Dafür gibt es sowohl kommerzielle Produkte als auch Open-Source-Projekte.

Inhaltsverzeichnis

Funktionsweise

Messaging ist eine Möglichkeit der lose gekoppelten und verteilten Kommunikation in Form von zwischen Softwarekomponenten verschickten Nachrichten. Messaging versucht, die sonst enge Kopplung anderer Kommunikationsmöglichkeiten wie TCP Kommunikation über Sockets, CORBA oder RMI durch die Einführung einer zwischen den Clients gelegenen Komponente aufzubrechen. Damit wird sichergestellt, dass die Clients kein näheres Wissen über die Gegenstelle(n) ihrer Kommunikation haben müssen, was sowohl den Einsatzbereich als auch die Wartung und Wiederverwendung der Komponenten erhöht.

JMS und der durch diese angesteuerte Dienst unterstützen zwei unterschiedliche Ansätze zum Versenden von Nachrichten, zum einen die Nachrichtenwarteschlange (englisch Queue) für sogenannte point-to-point Verbindungen und zum anderen ein Anmelde-Versendesystem (englisch Topic) für Publish-Subscribe-Kommunikation:

  • Bei der Warteschlange sendet der Sender an eine Queue, an der ein Empfänger hängt. Ist dieser nicht verfügbar, kann die Nachricht optional gespeichert werden und der Empfänger kann sie jederzeit später abholen. Man kann dies am besten mit einem Paketdienst vergleichen. Jede Sendung hat genau einen Empfänger. Ist dieser nicht zu Hause, kann er sich die Sendung zu einem beliebigen Zeitpunkt später abholen.
  • Bei dem Anmelde-Versendesystem werden die Nachrichten an ein Topic geschickt, auf das eine beliebige Anzahl von Empfängern hört. Wird die Nachricht nicht konsumiert, weil kein Empfänger sich an das Topic angemeldet hat, dann ist dies unerheblich. Man kann dies am besten mit einem Fernsehsender vergleichen (Broadcasting). Entweder man schaltet den Fernseher ein und sieht die Nachricht oder man lässt den Fernseher aus und sieht die Nachricht nicht. Wahlweise können die Nachrichten auch zwischengespeichert werden (durable-subscription).

Implementierung

Um Nachrichten senden bzw. empfangen zu können ist es zunächst nötig eine Queue bzw. ein Topic zu bestimmen, über welche die Kommunikation läuft. Dies wird üblicherweise mittels eines JNDI Lookups gelöst:

Context ctx = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory");
Queue myQueue = (Queue) ctx.lookup("MyQueue");

Anschließend wird eine Connection erzeugt, auf der eine Session gestartet wird. Darauf wird dann je nachdem ob gesendet oder empfangen wird ein Sender bzw. ein Receiver geöffnet, über den Messages gesendet bzw. empfangen werden können:

QueueConnection connection = factory.createQueueConnection();
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(myQueue);
TextMessage message = session.createTextMessage();
sender.send(message);

bzw.

...
QueueReceiver receiver = session.createReceiver(myQueue);
connection.start();
Message message = receiver.receive();

Das Senden und Empfangen via Topic erfolgt ähnlich zum Senden und Empfangen via Queue. Es werden einerseits andere Klassen verwendet (TopicSession, TopicConnection, TopicPublisher, TopicSubscriber, Topic), andererseits holt man beim Empfang einer Nachricht via Topic diese nicht mittels receiver.receive() ab, sondern implementiert einen MessageListener.onMessage(Message) EventHandler, der die Nachrichten via Message Events bekommt.

Die unterschiedlichen über Queues und Topics versendbaren Nachrichtentypen sind folgende:

  • Message - Nachricht ohne Inhalt (Body)
  • StreamMessage - Nachricht mit einem Stream von Java-Primitiven
  • MapMessage - Nachricht mit einer Map von Java-Objekten
  • TextMessage - Nachricht mit einem String (z.B. für XML-Messages)
  • ObjectMessage - Nachricht mit einem serialisierten Java Objekt
  • BytesMessage - Nachricht mit einem Stream von Bytes

JMS-Provider

Um JMS nutzen zu können, wird ein JMS-Provider benötigt, der die Topics, Queues und Sessions verwaltet. Die folgende Liste führt JMS-Provider auf. Sie nennt sowohl kommerzielle als auch freie Software, erhebt aber keinen Anspruch auf Vollständigkeit.

Nicht aufgeführt sind jedoch solche JMS-Provider, die ausschließlich als Bestandteil eines Java-EE-Containers (Java-Anwendungsservers) angeboten werden. Eine Übersicht von Java-EE-Containern ist separat verfügbar.

In der untenstehenden Tabelle bedeuten die in der Spalte „Betriebsmodi“ enthaltenen Angaben folgendes:

eigenständig
Der JMS-Provider läuft als eigenständiger Prozess (stand alone) und damit separat von den JMS-Client-Prozessen. Die Kommunikation mit den Clients erfolgt beispielsweise über TCP/IP oder Unix Domain Sockets.
eingebettet
Der JMS-Provider läuft in derselben JVM (embedded, colocated) wie einer der JMS-Clients. Ein Vorteil ist die schnellere Nachrichtenübertragung.

Moderne JMS-Provider erlauben beide Betriebsmodi.

Name Firma Lizenz Betriebsmodi URL
ActiveMQ Apache Open Source (Apache 2) eigenständig, eingebettet http://activemq.apache.org/
ApolloMQ Apache Open Source (Apache 2) http://activemq.apache.org/apollo/
FioranoMQ Fiorano kommerziell
iBus//MessageServer Softwired kommerziell
HornetQ (ehemals bekannt unter "JBoss Messaging") Red Hat Open Source (LGPL) eigenständig, eingebettet http://jboss.org/hornetq/
JORAM OW2 Open Source (LGPL) eigenständig, eingebettet http://joram.ow2.org/
MantaRay Coridan Open Source (Mozilla Public License) eigenständig, eingebettet
Mom4j Mom4j development team Open Source (LGPL) eingebettet
MRG Messaging Red Hat kommerziell http://www.redhat.com/mrg/messaging/
MuleMQ MuleSoft Inc. kommerziell http://www.mulesoft.com/mule-mq-high-performance-low-latency-JMS-messaging-for-the-enterprise
OpenJMS Open Source eigenständig, eingebettet http://openjms.sourceforge.net/
Open Message Queue Sun Microsystems Open Source eigenständig https://mq.dev.java.net/
Oracle Advanced Queuing (OAQ) Oracle kommerziell eingebettet http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96587/qintro.htm
Qpid Apache Open Source (Apache 2) http://qpid.apache.org/
RabbitMQ VMware, Inc. Open Source (Mozilla Public License) http://www.rabbitmq.com/
SAP JMS SAP kommerziell eingebettet http://www.sap.com
SonicMQ Progress Software kommerziell http://web.progress.com/de-de/sonic/sonicmq.html
Sun GlassFish Message Queue Sun Microsystems Open Source eigenständig www.sun.com/software/products/message_queue
SwiftMQ Router IIT Software kommerziell www.swiftmq.com
TIBCO Enterprise Message Service TIBCO kommerziell
webMethods Broker Software AG kommerziell
Websphere MQ IBM kommerziell eigenständig, eingebettet http://www-306.ibm.com/software/integration/wmq/
ØMQ oder auch ZeroMQ oder auch 0MQ iMatix Corporation Open Source (LGPL) http://www.zeromq.org/

Weblinks

Einzelnachweise

  1. J2EE: Java Message Service (JMS)
  2. Java Message Service Documentation

Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Java Message Service — (JMS)  стандарт промежуточного ПО для рассылки сообщений, позволяющий приложениям, выполненным на платформе J2EE, создавать, посылать, получать и читать сообщения. Коммуникация между компонентами, использующими JMS, асинхронна (процедура не… …   Википедия

  • Java Message Service — The Java Message Service (JMS) API is a Java Message Oriented Middleware (MOM) API for sending messages between two or more clients. JMS is a part of the Java Platform, Enterprise Edition, and is defined by a specification developed under the… …   Wikipedia

  • Java Message Service — L interface de programmation Java Message Service (JMS) permet d envoyer et de recevoir des messages de manière asynchrone entre applications ou composants Java. JMS permet d implémenter une architecture de type MOM (Message Oriented Middleware) …   Wikipédia en Français

  • Java Message Service — La API Java Message Service (en español servicio de mensajes Java), también conocida por sus siglas JMS, es la solución creada por Sun Microsystems para el uso de colas de mensajes. Este es un estándar de mensajería que permite a los componentes… …   Wikipedia Español

  • Java Message Service Provider — Java Message Service (JMS) ist eine durch den Java Community Process genormte Programmierschnittstelle (API) für die Ansteuerung von Message Oriented Middleware aus einem Client heraus, der in der Programmiersprache Java geschrieben ist. Die API… …   Deutsch Wikipedia

  • Java messaging service — Java Message Service L interface de programmation Java Message Service (JMS) permet d envoyer et de recevoir des messages de manière asynchrone entre applications ou composants Java. JMS permet d implementer une architecture de type MOM. Un… …   Wikipédia en Français

  • Java 2 Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java 2 Platform Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java EE — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java Platform Enterprise Edition — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia