Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (2. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Java ist auch eine Insel (2. Auflage)
gp Kapitel 18 Verteilte Programmierung mit RMI und SOAP
  gp 18.1 Entfernte Methoden
  gp 18.2 Nutzen von RMI bei Middleware-Lösungen
  gp 18.3 Die Lösung für Java ist RMI
    gp 18.3.1 Entfernte Objekte programmieren
    gp 18.3.2 Entfernte und lokale Objekte im Vergleich
    gp 18.3.3 RMI und CORBA
  gp 18.4 Definition einer entfernten Schnittstelle
  gp 18.5 Das entfernte Objekt
    gp 18.5.1 Der Bauplan für entfernte Objekte
    gp 18.5.2 Der Konstruktor
    gp 18.5.3 Implementierung der entfernten Methoden
    gp 18.5.4 UnicastRemoteObjekt, RemoteServer und RemoteObject
  gp 18.6 Stellvertreterobjekte erzeugen
    gp 18.6.1 Das Dienstprogramm rmic
  gp 18.7 Der Namensdienst (Registry)
    gp 18.7.1 Der Port
  gp 18.8 Der Server: entfernte Objekte beim Namensdienst anmelden
    gp 18.8.1 Automatisches Anmelden bei Bedarf
  gp 18.9 Einen Client programmieren
    gp 18.9.1 Einfaches Logging
  gp 18.10 Aufräumen mit dem DGC
  gp 18.11 Entfernte Objekte übergeben und laden
    gp 18.11.1 Klassen vom RMI-Klassenlader nachladen
    gp 18.11.2 Sicherheitsmanager
  gp 18.12 Registry wird vom Server gestartet
  gp 18.13 RMI über die Firewall
    gp 18.13.1 RMI über HTTP getunnelt
  gp 18.14 Daily Soap
    gp 18.14.1 SOAP-Implementierung der Apache-Gruppe
    gp 18.14.2 Einen Client mit der Apache-Bibliothek implementieren
    gp 18.14.3 Der Seifen-Server
  gp 18.15 Java-API für XML Messaging (JAXM)
  gp 18.16 Java Message Service (JMS)
    gp 18.16.1 OpenJMS
    gp 18.16.2 Beispiel mit Konsument und Produzent im Publish–Subscribe-Modell


Galileo Computing

18.16 Java Message Service (JMSdowntop

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 der 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:

gp  >http://java.sun.com/products/jms/
gp  >http://java.sun.com/products/jms/docs.html
gp  >http://www.javaworld.com/javaworld/jw-02-1999/jw-02-howto.html
gp  >http://www.codemesh.com/en/JMSPressReleaseMay01.html
gp  >http://www.swiftmq.com/
gp  >http://www.execpc.com/~gopalan/jms/jms.html

Galileo Computing

18.16.1 OpenJMS  downtop

Open JMS (http://openjms.sourceforge.net/) ist eine Open-Source-Implementierung des Sun Java Message Services. Das Produkt ist gut ausgereift und einfach in der Installation. Es ist auf den Architekturen Windows 98/NT/2000, Linux oder Mac OS X mit einer Java 1.2- oder einer weiteren Installation problemlos lauffähig. Eine aktuelle Version liegt unter http://openjms.sourceforge.net/download.html. Die komprimierten Dateien unter den Namen openjms-version-src.zip beziehungsweise openjms-version-src.tgz enthalten alle benötigten Jar-Archive etwa für XML-Parsing, JDBC 2.0-Erweiterungen oder Transaktionsdienste. Die Pre-Build-Version enthält einige Beispiele, und es lohnt sich, diese Distribution zu installieren.

Installation und Start des Servers

Damit wir die beigelegten Testprogramme nutzen können, müssen wir OpenJMS erst einmal vorbereiten. Wir setzen in der Datei build.bat die Umgebungsvariable JAVA_HOME, sofern sie noch nicht gesetzt ist. Dann erzeugt die Batch-Datei build.bat (oder build.sh unter Unix) über ein Ant-Skript alle kompilierten Klassen, und im bin-Verzeichnis ist der Server bereit. Dieser lässt sich anschließend starten, wobei wir uns im bin-Verzeichnis befinden sollten. (Die Beispiele werden ebenfalls im bin-Verzeichnis gestartet.)

$ start startjms -config ..\config\rmi_jms.xml
OpenJMS 0.7.1 (build 1)
Exolab Inc. (C) 1999-2001. All rights reserved. www.openjms.org
0 [main] DEBUG exolab  - Attribute name=serverClass 
-> org.exolab.jms.server.rmi.RmiJmsServer
10 [main] DEBUG exolab  - Attribute name=jmsServerName 
-> OpenJmsServer
10 [main] DEBUG exolab  - Attribute name=clientPingInterval -> 15
...
17:46:10.601 INFO  [main] - JMS Server is bound to //localhost:1099/OpenJmsServer
17:46:10.631 INFO  [main] - JMS Admin Server is bound to //localhost:1099/JmsAdminServer
17:46:11.141 INFO  [main] - Bound connection factory JmsQueueConnectionFactory
17:46:11.151 INFO  [main] - Bound connection factory JmsTopicConnectionFactory

Mit start öffnen wir unter Windows in der Shell ein neues Fenster, sodass wir in dem aktuellen Fenster gleich einen Konsumenten und Produzenten starten können.


Galileo Computing

18.16.2 Beispiel mit Konsument und Produzent im Publish–Subscribe-Modell  toptop

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 Beispiel-Konsumenten wollen wir nun starten. 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
Message listener has been set

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
examples client.console.SimplePublisher -topic Inselnews -count 2
Finished publishing 2 messages

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:

org.exolab.jms.message.TextMessageImpl@b0bad7,JMSDeliveryMode=
NON_PERSISTENT, Priority=7, JMSMessageID=ID:3062033699640309713

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.

 





Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de