Home ORDIX AG             Dienstleistung             Trainingsshop    Kunden / Referenzen Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  4/2007  Pfeil  Datenbanken
suche: 
Dieser Artikel richtet sich an Entwickler, die mit Hilfe der Programmiersprache Java auf das Messaging System von Oracle zugreifen möchten.

Glossar

Oracle AQ
Oracle Advanced Queueing. Messaging-Verfahren zum Nachrichtenaustausch über eine Oracle Datenbank
PL/SQL
Procedural Language/SQL. Prozedurale Programmiersprache der Firma Oracle.
JEE
Java Enterprise Edition. JEE ist die Spezifikation zur Entwicklung und Ausführung von komplexen Java Anwendungen.
JMS
Java Message Service. JMS ist die Spezifikation der Firma Sun Microsystems zum Austausch von Nachrichten und Teil der JEE.
API
Application Programming Interface. Sammlung von Klassen, die eine Schnittstelle zu einer Hardware oder Anwendung definieren.



Oracle Advanced Queuing und Java

Oracle bietet mit Advanced Queuing (AQ) ein Messaging Verfahren zum Nachrichtenaustausch über eine Oracle Datenbank an. Der Zugriff auf das AQ System erfolgt üblicherweise über die PL/SQL-Pakete DBMS_AQ und DBMS_AQADM. Über diese Pakete können u. a. Queues erstellt und Nachrichten gesendet und empfangen werden. Eine weitere Möglichkeit, auf Oracle AQ zuzugreifen, ist die Verwendung der Programmiersprache Java. Diese Variante wird im Folgenden vorgestellt.

Java und Nachrichtenaustausch

Sun Microsystems bietet mit der Java Platform Enterprise Edition eine Grundlage zur Programmierung von komplexen Anwendungen. Die Java Enterprise Edition (JEE) beinhaltet eine Reihe von Spezifikationen. Zur Verwendung dieser ist eine entsprechende Implementierung notwendig.

Auch bei dem Java Message Service handelt es sich um eine Spezifikation der JEE. Sie ermöglicht den Austausch von Nachrichten zwischen zwei oder mehreren Teilnehmern.

Oracle stellt mit dem Oracle Enterprise Messaging Service eine Implementierung der Sun Spezifikation bereit. Mit Hilfe dieser API können Nachrichten so versendet und empfangen werden, wie es der Java Message Service (JMS) "vorschreibt". JMS verwendet dabei eine etwas andere Terminologie als sie bei dem Oracle AQ zu finden ist. Bei JMS spricht man beim Senden und Empfangen von Nachrichten nicht von Enqueue und Dequeue, sondern von Send und Receive. Eine Queue mit mehreren Abonnenten wird als Topic bezeichnet.

Schauen wir uns nun an, welche Vorbereitungen für den Zugriff auf ein Oracle AQ System aus Java heraus notwendig sind.

Welche Bibliotheken benötige ich?

Um die von Oracle bereitgestellte Implementierung des JMS nutzen zu können, müssen zwei Bibliotheken in den Classpath (Umgebungsvariable, die die vom Java Compiler benötigten Class-Dateien enthält) eingebunden werden: Einmal die Bibliothek javaee.jar, welche Teil der Java Enterprise Edition ist und die Bibliothek oracleaq.jar, welche zum "Oracle Container for J2EE (OC4J)" gehört.

OC4J ist die Kern-Laufzeitumgebung des Oracle Application Servers. Zusätzlich wird für den Zugriff auf eine Oracle Datenbank der entsprechende JDBC-Treiber benötigt, der sich in der Bibliothek ojdbc14.jar befindet. In diesem Falle der Treiber für eine Oracle 10g Datenbank.

Aufbau der Verbindung zur Oracle Datenbank

Um auf das Oracle AQ zugreifen zu können, muss zunächst eine Verbindung vom Java Programm zur Oracle Datenbank hergestellt werden. Dazu wird die entsprechende Treiberklasse geladen, wie Abbildung 1 zeigt.

Class.forName("oracle.jdbc.driver.OracleDriver");
Abb. 1: Laden des Datenbank Treibers.
Connection conn=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE", "aq_user", "aq_user");
Abb. 2: Aufbau einer Verbindung zur Datenbank.
QueueConnection queueConnection =
   AQjmsQueueConnectionFactory.createQueueConnection(conn);
queueConnection.start();
Abb. 3: Zugriff auf die Queue.
QueueSession queueSession =
  queueConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
AQjmsSession jmsSession = (AQjmsSession) queueSession;
Abb. 4: Instanziierung der AQjmsSession.
Queue queue = jmsSession.getQueue("aq_admin", "MESSAGE_QUEUE");
Abb. 5: Erzeugen einer Referenz auf die Queue.
Message message = new Message();
message.setNo(123);
message.setTitle("JMS Message Title");
message.setText("Java Nachrichten Text");

ObjectMessage objectMessage = (ObjectMessage)queueSession.createObjectMessage(message);

QueueSender sender = jmsSession.createSender(queue); sender.send(objectMessage);
Abb. 6: Versenden einer Nachricht.
queueSession.commit();
queueSession.close();
Abb. 7: Abschließen des Sendevorgangs.
MessageConsumer consumer = jmsSession.createReceiver(queue);
Abb. 8: Erzeugen des Message Consumers zum Empfang von Nachrichten.
ObjectMessage messageObject =
   (ObjectMessage) consumer.receive(3000);
Abb. 9: Cast der Nachricht in eine ObjectMessage.
Message message = (Message)messageObject.getMessage();
Abb. 10: Bean mit dem Nachrichteninhalt beziehen.
System.out.println(message.getNo());
System.out.println(message.getTitle());
Abb. 11: Werte der Nachricht ausgeben.

Der nächste Schritt besteht darin, eine Verbindung zur Datenbank herzustellen. Wie diese mit Hilfe des Driver Managers aus dem java.sql Paket aufgebaut wird, zeigt Abbildung 2.

Zur Lokalisierung der Datenbank wird der getConnection Methode die Datenbank-URL und ein Benutzer mit Passwort, der Zugriff auf die gewünschte Queue hat, mitgegeben.

Nun ist eine Verbindung zur Datenbank aufgebaut. Der nächste Schritt besteht darin, sich mit der Queue zu verbinden, um anschließend Nachrichten senden und empfangen zu können.

Aufbau der Verbindung zur Queue

Auf Basis des Connection-Objekts wird anschließend ein spezielles QueueConnection- Objekt zum Zugriff auf die Queue erzeugt und gestartet (siehe Abbildung 3).

Daraufhin ist es notwendig, eine AQjmsSession zu beziehen. Diese Session stellt die Schnittstelle zum AQ System dar. Abbildung 4 zeigt die Instanziierung einer AQjmsSession.

Die AQjmSession stellt eine Reihe von Methoden zur Administration von AQ-Objekten, wie das Erstellen einer Queue oder einer Nachricht, bereit. Gehen wir davon aus, dass bereits eine Queue in der Datenbank existiert. Dann ist es ein Leichtes, eine Referenz auf diese zu erzeugen. Es genügt, die Methode getQueue, wie in Abbildung 5 demonstriert, aufzurufen und als Argumente den Besitzer und den Namen der Queue mitzugeben.

Damit sind die Vorbereitungen abgeschlossen und es ist möglich, über das Queue-Objekt Nachrichten zu empfangen und zu versenden.

Versenden einer Nachricht

Bevor eine Nachricht versendet werden kann, muss sie zunächst erstellt (oder in der objektorientierten Sprache: instanziiert) werden. Eine Nachricht wird in Form einer üblichen Java Bean repräsentiert. Wichtig ist, dass diese Bean das Interface Serializable implementiert, da der Inhalt der Bean als Datenstrom übertragen wird. Die Properties der Bean werden dann wie üblich über die Setter-Methoden mit den gewünschten Werten versorgt. Über die Queue Session wird dann eine ObjectMessage erzeugt, die anschließend mit Hilfe eines QueueSenders verschickt werden kann. Die in Abbildung 6 gezeigten Code-Zeilen demonstrieren den Sendevorgang einer Nachricht.

Nun ist die Nachricht versandt, jedoch noch nicht in der Queue sichtbar. Das liegt daran, dass das Versenden der Nachricht in einer Transaktion abläuft. Somit muss der Sendevorgang noch mit einem Commit (siehe Abbildung 7) abgeschlossen werden. Der Aufruf der Methode close() gibt die nicht mehr benötigten Ressourcen wieder frei.

Empfangen einer Nachricht

Für den Empfang einer Nachricht wird ein MessageConsumer (siehe Abbildung 8) benötigt: Dieser stellt die Methode receive bereit, mit der eine Nachricht aus der Queue gelesen wird. Als Argument erwartet die Methode receive die Zeit in Millisekunden, die festlegt, wie lange auf eine Nachricht gewartet werden soll. Die empfangene Nachricht wird dann, wie in Abbildung 9 zu sehen, in eine ObjectMessage gecastet.

Über den in Abbildung 10 gezeigen Aufruf kann die eigentliche Bean bezogen werden, über die dann einzelne Werte der Nachricht ausgegeben werden können (siehe Abbildung 11). Auch der Empfang einer Nachricht wird über ein Commit abgeschlossen.

Verwendung der nativen Java Schnittstelle

Mit Hilfe von JMS können die wesentlichen Funktionalitäten von Oracle AQ genutzt werden. Es gibt jedoch einige Oracle spezifische Funktionalitäten des AQ, die in der JMS Spezifikation nicht berücksichtigt werden. Oracle stellt dem Entwickler daher zusätzliche Erweiterungen zur Verfügung. Um diese nutzen zu können, wird die Bibliothek oracleaq.jar benötigt, die auch schon bei JMS zum Einsatz kam.

Die Verwendung von Oracle Object Typen ist eine nützliche Funktion der nativen Java Schnittstelle. Mit Hilfe von PL/SQL kann ein eigener Object Typ erstellt werden, der das Format einer Message Payload beschreibt. Nun kann über das Tool jpublisher eine Java Bean generiert werden, die dem selbst erstellten Object Typ entspricht. Damit ist es möglich, Nachrichten mit individuellem Inhalt zu verwenden.

Weitere Möglichkeiten

Das in diesem Artikel gezeigte Beispiel zeigt nur einen kleinen Ausschnitt der vielfältigen Möglichkeiten der Messaging Lösung von Oracle. Komplexer wird die Thematik bei dem Publish Subscribe Messaging Modell, bei dem es mehrere Sender und Empfänger geben kann. In diesem Zusammenhang müssen dann auch Sicherheitsaspekte bedacht werden: Wer darf Nachrichten senden und empfangen? Wie lange ist eine Nachricht gültig? Auch die Thematik der Fehlerbehandlung ist nicht zu vernachlässigen. Oracle bietet hier ein durchdachtes Konzept bei auftretenden Fehlern in der Nachrichtenübertragung. Kombiniert mit dem Java Exception Handling, auf das in diesem Artikel aus Gründen der Übersichtlichkeit verzichtet wurde, ist der Programmierer in der Lage, auf Fehler zu reagieren.

Fazit

Mit Hilfe der von Oracle bereitgestellten Bibliotheken ist ein Zugriff auf das AQ System aus Java heraus komfortabel möglich. Ein tiefergehendes Verständnis der Objektorientierung ist dabei nicht unbedingt notwendig. Allerdings gestaltet sich der Einstieg recht schwierig, da es sich um eine recht komplexe Thematik handelt. Die von Oracle bereitgestellte Dokumentation ist sehr umfangreich und eignet sich als gutes Nachschlagewerk. Für einen praxisnahen Einstieg in die Thematik bietet ORDIX einen Workshop zum Thema Oracle Advanced Queuing an, in dem auch der Zugriff mit Hilfe von Java behandelt wird. Informationen zu diesem und anderen Seminaren finden Sie unter http://training.ordix.de.

Jens Stahl (info@ordix.de).