18.18 Java Message Service (JMS)
Der JMS (http://java.sun.com/products/jms/index.html) dient dem asynchronen Austausch von Daten. Er unterstützt zwei unterschiedliche Ansätze zum Versenden von Nachrichten, zum einen die Nachrichtenschlangen (Message Queues) und zum anderen ein Anmelde-Versendesystem (Publish-Subscribe). Bei gerichteten Punkt-zu-Punkt-Verbindungen (Point-to-Point-, PTP-, Systemen) sendet ein Client eine Nachricht an einen Empfänger, der die Nachricht in einer Queue einreiht. JMS definiert, wie der Client Nachrichten verschicken kann und wie die Nachrichten aus der Schlange genommen werden. Beim Anmeldesystem interessiert sich der Client für bestimmte Nachrichten, die dann automatisch verteilt werden. Diese Nachrichten heißen in JMS Topics.
Jede Nachricht, die JMS versendet, besteht aus einem Kopf (Header), einigen Eigenschaften (Properties) und dem Körper (Body). Der Header enthält Felder mit Angaben zur Identität und nötige Informationen, damit die Nachricht vermittelt werden kann (Routing-Informationen). Die Properties sind zusätzliche Felder, die jede Applikation selbst bestimmen kann. Der Datenteil bildet den Körper, der aus unterschiedlichen Formaten bestehen kann: einem Datenstrom, der sequenziell verarbeitet wird, Schlüssel-Werte-Paaren, Text, einem Java-Objekt oder uninterpretierten Bytes.
Obwohl ursprünglich JMS ein reiner Java-Dienst war, gibt es die ersten Java Message Services für C++ etwa von der Firma Codemesh. Mit dem Produkt JMS Courier können C++-Applikationen die Java Messaging Services einsetzen.
Weitere Informationen finden sich unter:
18.18.1 OpenJMS
OpenJMS (http://openjms.sourceforge.net/) ist eine Open-Source-Implementierung der Sun Java Message Services API 1.0.2 Spezifikation. Das Produkt ist gut ausgereift und einfach in der Installation. Es ist auf allen Architekturen mit einer virtuellen Maschine > Version 1.2 problemlos lauffähig. Die komprimierten Dateien unter den Namen openjms-version-src.zip (Version etwa 0.7.4) beziehungsweise openjms-version-src.tgz enthalten alle benötigten Jar-Archive etwa für XML-Parsing, JDBC 2.0-Erweiterungen oder Transaktionsdienste.
Installation und Start des Servers
Damit wir die beigelegten Testprogramme nutzen können, müssen wir OpenJMS erst einmal vorbereiten, sprich den Server starten. Dazu wechseln wir in das bin-Verzeichnis und rufen auf:
$ start startjms -config ..\config\rmi_jms.xml
Using OPENJMS_HOME: ..
Using JAVA_HOME: C:\Programme\j2sdk1.4.1
Using CLASSPATH: ;..\lib\openjms-0.7.4.jar
OpenJMS 0.7.4 (build 17)
Exolab Inc. (C) 1999-2003. All rights reserved. openjms.sourceforge.net
14:45:31.725 INFO [main] - Instantiated the RmiRegistryService service on port 1099
14:45:31.735 INFO [main] - Embedded RMI Registry running on port 1099
...
14:45:33.187 INFO [main] - JMS Admin Server is bound to //localhost:1099/JmsAdmin
Server
Mit start öffnen wir unter Windows in der Shell ein neues Fenster, so dass wir in dem aktuellen Fenster gleich einen Konsumenten und Produzenten starten können.
18.18.2 Beispiel mit Konsument und Produzent im Publish-Subscribe-Modell
Am einfachsten können wir uns der Software nähern, wenn wir eine kleine Applikation ansehen. Wie es bei den Nachrichtendiensten üblich ist, gibt es einen Interessenten, den Konsumenten (engl. consumer), der für Neuigkeiten ein offenes Ohr hat. Einen Beispielkonsumenten wollen wir nun starten. Die Beispiele bauen auf Beispielklassen von OpenJMS auf. Um diese zu übersetzen, ist im Basisverzeichnis zunächst die Skriptdatei build aufzurufen.
Er meldet sich bei einem Topic, welches wir »Inselnews« nennen wollen, an und horcht auf die Nachrichten, die an diesen Topic gehen.
$ start runconsumer -topic Inselnews
examples client.console.SimpleConsumer -topic Inselnews
Using provider url rmi://localhost:1099/JndiServer
Damit startet ein Konsument, der eine Minute auf Nachrichten wartet. Falls keine empfangen werden, beendet er sich. Doch schnell wollen wir ihm seinen Produzenten geben:
$ runpublisher -topic Inselnews -count 2
Using provider url rmi://localhost:1099/JndiServer
The publisher published 2 messages on topic Inselnews
examples client.console.SimplePublisher -topic Inselnews -count 2
Der Produzent (auch Publisher genannt) wird jetzt zweimal eine Nachricht mit dem Inhalt »message X« an den Topic Inselnews verschicken. Da der Konsument auf dem Kanal Inselnews horcht und seine empfangenen Nachrichten auf dem Bildschirm ausgibt, ist dort zu sehen:
[1 of 0] JMSDeliveryMode=NON_PERSISTENT, Priority=7, JMSMessageID=ID:4837598104159680369
[2 of 0] JMSDeliveryMode=NON_PERSISTENT, Priority=2, JMSMessageID=ID:6379475661284011613
Die einfachen Batch-Dateien rufen lediglich den Java-Interpreter mit den Klassen client.console.SimpleConsumer und client.console.SimplePublisher auf, deren Quellcode im Verzeichnis src\examples\openjms\examples\client\console zu finden ist.
|