Versionshinweise zu Sun Java System Message Queue 4.1

Neuheiten in Version 4.0

Message Queue 4.0 umfasst die folgenden neuen Funktionen:

Die genannten Themen werden in den folgenden Unterabschnitten näher beschrieben.


Achtung – Achtung –

Eine der eher kleinen, jedoch wichtigen Änderungen, die mit Version 4.0 eingeführt wurden, ist die Tatsache, dass die Befehlszeilenoption nun nicht mehr zur Angabe eines Passworts verwendet werden kann. Daher müssen nun alle Passwörter in einer Datei gespeichert werden, wie unter Veraltete Passwortoption beschrieben.


Schnittstellenänderungen an der C-API und der C-Clientlaufzeit

Version 4.0 von Message Queue fügt zwei Eigenschaften hinzu, die für alle Nachrichten gesetzt werden, die in einer Warteschlange mit nicht zugestellten Nachrichten platziert wurden.

Schnittstellenänderungen an der Java-API und der Java-Clientlaufzeit

Version 4.0 von Message Queue fügt zwei Eigenschaften hinzu, die für alle Nachrichten gesetzt werden, die in einer Warteschlange mit nicht zugestellten Nachrichten platziert wurden.

Anzeigen von Informationen zum persistenten Speicher

Der Unterbefehl query wurde zum Befehl imqdbmgr hinzugefügt. Verwenden Sie diesen Unterbefehl zum Anzeigen von Informationen zum persistenten Speicher (u. a. Speicherversion, Datenbankbenutzer und ob die Datenbanktabellen erstellt wurden).

Im Folgenden finden Sie ein Beispiel für die Informationen, die über diesen Befehl angezeigt werden.


imqdbmgr query

[04/Oct/2005:15:30:20 PDT] Verwenden des integrierten Persistenzspeichers:
        Version=400
        Broker-ID=Mozart1756
        Datenbankverbindung url=jdbc:oracle:thin:@Xhome:1521:mqdb
        Datenbankbenutzer=scott
Ausführen im Standalone-Modus.
Datenbanktabellen wurden bereits erstellt.

Formatänderungen für die persistente Speicherung

In Version 3.7 UR1 von Message Queue wurden zur Verbesserung der Leistung zwei Änderungen am persistenten Speicherformat eingeführt. Eine Änderung betrifft den Dateispeicher, die andere den JDBC-Speicher.

Da sich diese Änderungen auf die Speicherkompatibilität auswirken, wurde die Speicherversion für Dateispeicher und JDBC-Speicher in Version 3.7 UR1 von Message Queue von 350 in 370 geändert.

In Version 4.0 von Message Queue wurden Änderungen am JDBC-Speicher eingeführt, um die Leistung zu optimieren und zukünftige Erweiterungen zu unterstützen. Aus diesem Grund wurde die Version des JDBC-Speichers in 400 geändert. Beachten Sie, dass in Version 4.0 die Version des dateibasierten persistenten Speichers weiterhin 370 lautet, da hier keine Änderungen durchgeführt wurden.

Message Queue 4.0 unterstützt die automatische Konvertierung des persistenten Speichers in die neuesten Versionen der dateibasierten persistenten Speicher sowie der persistenten JDBC-Speicher. Beim erstmaligen Ausführen von imqbrokerd wird ein älterer Speicher (sofern vorhanden) in das neue Format migriert.

Wenn Sie für dieses Upgrade ein Rollback durchführen müssen, können Sie Message Queue 4.0 deinstallieren und anschließend erneut die Version installieren, die zuvor ausgeführt wurde. Da die ältere Kopie des Speichers beibehalten wird, kann der Broker mit der älteren Kopie des Speichers ausgeführt werden.

Broker-Verwaltung

Im Dienstprogramm Command (imqcmd) sind ein neuer Unterbefehl und verschiedene neue Optionen verfügbar, über welche Administratoren den Broker inaktivieren, den Broker nach einem festgelegten Intervall herunterfahren, eine Verbindung löschen oder Java-Systemeigenschaften hinzufügen können (z. B. verbindungsbezogene Eigenschaften).

Vollständige Informationen zur Syntax des Befehls imqcmd finden Sie in Kapitel 13, Command Line Reference in Sun Java System Message Queue 4.1 Administration Guide.

JDBC-Persistenzunterstützung

Apache Derby Version 10.1.1 wird jetzt als JDBC-kompatibler Persistenzspeicheranbieter unterstützt.

SSL-Unterstützung

Ab Version 4.0 ist der Standardwert für die Werkseinstellung der Clientverbindung imqSSLIsHostTrusted auf false gesetzt. Wenn die Anwendung jedoch von dem vorherigen Standardwert true abhängt, müssen Sie die Eigenschaft neu konfigurieren und ausdrücklich auf true setzen.

Möglicherweise vertrauen Sie dem Host, wenn der Broker so konfiguriert ist, dass er selbst signierte Zertifikate verwendet. In diesem Fall sollten Sie zusätzlich zur Angabe, dass die Verbindung einen SSL-basierten Verbindungsdienst verwenden soll (über die imqConnectionType-Eigenschaft), die Eigenschaft imqSSLIsHostTrusted auf "true" setzen.

Um Clientanwendungen sicher auszuführen, wenn der Broker selbst signierte Zertifikate verwendet, verwenden Sie beispielsweise einen ähnlichen Befehl wie den folgenden.

java -DimqConnectionType=TLS 
      -DimqSSLIsHostTrusted=true <Clientanwendungsname>

Um das Verwaltungstool imqcmd sicher auszuführen, wenn der Broker selbst signierte Zertifikate verwendet, verwenden Sie einen ähnlichen Befehl wie den folgenden.

imqcmd list svc -secure -DimqSSLIsHostTrusted=true

JMX-Unterstützung

Für die Konfiguration und Überwachung von Message Queue-Brokern wurde in Übereinstimmung mit der JMX-Spezifikation (Java Management Extensions) eine neue API hinzugefügt. Mithilfe dieser API haben Sie die Möglichkeit, Broker-Funktionen programmatisch in einer Message Queue-Clientanwendung zu konfigurieren und zu überwachen. In früheren Versionen von Message Queue war der Zugriff auf diese Funktionen ausschließlich über die Befehlszeile oder die Administrationskonsole möglich.

Die API besteht aus mehreren JMX-MBeans (Managed Beans) zur Verwaltung der folgenden mit Message Queue verbundenen Ressourcen:

Diese MBeans stellen Attribute und Operationen für das synchrone Abrufen und Manipulieren des Status der zugrunde liegenden Ressourcen bereit, sowie Benachrichtigungen, über die eine Clientanwendung Statusänderungen überwachen und asynchron darauf antworten kann, sobald diese auftreten. Mithilfe der JMX-API können Clientanwendungen Konfigurations- und Überwachungsaufgaben wie die folgenden durchführen:

Eine Einführung in die JMX-API und vollständige Referenzinformationen finden Sie im Sun Java System Message Queue 4.1 Developer’s Guide for JMX Clients .

Broker-Unterstützung: JMX-bezogene Eigenschaften

Zur Unterstützung der JMX-API wurden mehrere neue Broker-Eigenschaften hinzugefügt(siehe Tabelle 1–3). Keine dieser Eigenschaften kann über die Befehlszeile mit dem Message Queue-Dienstprogramm Command (imqcmd) festgelegt werden. Stattdessen besteht die Möglichkeit, diese über die -D-Option des Broker-Dienstprogramms (imqbrokerd) festzulegen oder sie manuell in der Instanzkonfigurationsdatei des Brokers ( config.properties) zu bearbeiten. Zudem lassen sich einige dieser Eigenschaften (imq.jmx.rmiregistry.start, imq.jmx.rmiregistry.use, imq.jmx.rmiregistry.port) mit den neuen Broker-Dienstprogrammoptionen festlegen, die in Tabelle 1–4 beschrieben werden. In der Tabelle sind sämtliche Optionen mit Angaben zu Typ und Verwendung enthalten.

Tabelle 1–3 Neue Broker-Eigenschaften für JMX-Unterstützung

Eigenschaft 

Typ 

Beschreibung 

imq.jmx.rmiregistry.start

Boolean

Gibt an, ob die RMI-Registrierung beim Broker-Start gestartet wird.

Wenn der Wert true lautet, startet der Broker eine RMI-Registrierung bei dem von imq.jmx.rmiregistry.port angegebenen Port und verwendet diesen, um den RMI-Stub für JMX-Connectors zu speichern. Beachten Sie, dass der Wert von imq.jmx.rmiregistry.use in diesem Fall ignoriert wird.

Standardwert: false

imq.jmx.rmiregistry.use

Boolean

Gibt an, ob eine externe RMI-Registrierung verwendet wird.

Gilt nur, wenn der Wert für imq.jmx.rmiregistry.start false lautet.

Wenn der Wert true lautet, verwendet der Broker eine externe RMI-Registrierung bei dem von imq.jmx.rmiregistry.port angegebenen Port, um den RMI-Stub für JMX-Connectors zu speichern. Die externe RMI-Registrierung muss bereits beim Broker-Start ausgeführt werden.

Standardwert: false

imq.jmx.rmiregistry.port

Integer

Portnummer der RMI-Registrierung

Gilt nur, wenn der Wert für imq.jmx.rmiregistry.start oder imq.jmx.rmiregistry.use true lautet. JMX-Connectors können anschließend so konfiguriert werden, dass sie die RMI-Registrierung verwenden, indem sie diese Portnummer im URL-Pfad der JMX-Dienst-URLs einfügen.

Standardwert: 1099

imq.jmx.connector.list

String

Namen von vorkonfigurierten JMX-Connectors (getrennt durch Kommas)

Standardwert: jmxrmi,ssljmxrmi

imq.jmx.connector.activelist

String

Namen von JMX-Connectors, die beim Broker-Start aktiviert werden sollen (getrennt durch Kommas)

Standardwert: jmxrmi

imq.jmx.connector.Connector-Name.urlpath

String

URL-Pfad-Komponente der JMX-Dienst-URL für Connector Connector-Name

Nützlich in Fällen, in denen der URL-Pfad für den JMX-Dienst ausdrücklich festgelegt werden muss (z. B. bei der Verwendung einer externen RMI-Registrierung).

Standardwert: Wenn eine RMI-Registrierung zum Speichern des RMI-Stub für JMX-Connectors verwendet wird (d. h., wenn imq.jmx.registry.start oder imq.jmx.registry.use auf true gesetzt sind)

   /jndi/rmi://Broker-Host:RMI-Port
      /Broker-Host/Broker-Port/Connector-Name

Wenn keine RMI-Registrierung verwendet wird (standardmäßig lautet der Wert für imq.jmx.registry.start und imq.jmx.registry.use false):

   /stub/RMI-Stub

Wobei RMI-Stub eine verschlüsselte und serielle Darstellung des RMI-Stub selbst ist

 

imq.jmx.connector.Connector-Name.useSSL

Boolean

Gibt an, ob ein SSL (Secure Socket Layer) für Connector Connector-Name verwendet wird.

Standardwert: false

imq.jmx.connector.Connector-Name.brokerHostTrusted

Boolean

Gibt an, ob vom Broker für Connector Connector-Name bereitgestellte Zertifikate vertraut wird.

Gilt nur, wenn der Wert für imq.jmx.connector.Connector-Name.useSSL true lautet.

Lautet der Wert false, überprüft die Message Queue-Clientlaufzeit alle bereitgestellten Zertifikate. Die Validierung schlägt fehl, wenn die Signatur des Zertifikats nicht im Vertrauensspeicher des Clients enthalten ist.

Wenn der Wert true lautet, wird die Validierung des Zertifikats übersprungen. Dies kann beispielsweise beim Testen von Software hilfreich sein, wenn ein selbst signiertes Zertifikat verwendet wird.

Standardwert: false

Die Eigenschaft imq.jmx.connector.list definiert eine Reihe benannter JMX-Connectors, die beim Broker-Start erstellt werden; imq.jmx.connector.activelist legt fest, welcher dieser Connectors aktiviert werden soll. Jeder benannte Connector verfügt somit über eigene Eigenschaften:

imq.jmx.connector.Connector-Name .urlpath

imq.jmx.connector.Connector-Name .useSSL

imq.jmx.connector.Connector-Name .brokerHostTrusted

Standardmäßig werden zwei JMX-Connectors namens jmxrmi und ssljmxrmi erstellt. Entsprechend der Konfiguration verwendet der erste keine SSL-Verschlüsselung (imq.jmx.connector.jmxrmi.useSSL = false und der zweite verwendet diese (imq.jmx.connector.ssljmxrmi.useSSL = true). Per Voreinstellung ist nur der jmxrmi-Connector beim Broker-Start aktiviert. Weitere Informationen zum Aktivieren des ssljmxrmi-Connector für eine sichere Kommunikation finden Sie unter SSL-Unterstützung für JMX-Clients.

Zudem wurden neue Optionen (Tabelle 1–4) zum Befehlszeilendienstprogramm Broker hinzugefügt (imqbrokerd), um die Nutzung, den Startvorgang und den Port für die RMI-Registrierung zu steuern. Die Verwendungs- und Wirkungsweise dieser Optionen entspricht der der äquivalenten Broker-Eigenschaften, die in Tabelle 1–3 beschrieben sind. In der Tabelle sind alle Optionen mit der jeweiligen äquivalenten Broker-Eigenschaft und Beschreibung aufgeführt.

Tabelle 1–4 Neue Broker-Dienstprogrammoptionen für JMX-Unterstützung

Option 

Äquivalente Broker-Eigenschaft 

Beschreibung 

-startRmiRegistry

imq.jmx.rmiregistry.start

Gibt an, ob die RMI-Registrierung beim Broker-Start gestartet wird.

-useRmiRegistry

imq.jmx.rmiregistry.use

Gibt an, ob eine externe RMI-Registrierung verwendet wird.

-rmiRegistryPort

imq.jmx.rmiregistry.port

Die Portnummer der RMI-Registrierung

Ein neuer Unterbefehl (Tabelle 1–5) wurde zum Befehlszeilendienstprogramm Command (imqcmd) für die Auflistung der JMX-Dienst-URLs von JMX-Connectors hinzugefügt, die beim Broker-Start erstellt und gestartet wurden. Diese Information wird von JMX-Clients benötigt, die nicht die Message Queue-Convenience-Klasse AdminConnectionFactory verwenden, um die JMX-Connectors abzurufen. Darüber hinaus kann sie zum Verwalten und Überwachen von Message Queue über einen generischen JMX-Browser, wie Java Monitoring und Management Console ( jconsole), verwendet werden.

Tabelle 1–5 Neuer Unterbefehl für das Dienstprogramm Command

Unterbefehl 

Beschreibung 

list jmx

Listet JMX-Dienst-URLs von JMX-Connectors auf

SSL-Unterstützung für JMX-Clients

Wie oben bereits erwähnt, ist der Message Queue-Nachrichten-Broker standardmäßig für eine sichere Kommunikation über den vordefinierten JMX-Connector jmxrmi konfiguriert. Für Anwendungen muss zur Verwendung von SSL (Secure Socket Layer) für eine sichere Kommunikation der alternative, sichere JMX-Connector ssljmxrmi aktiviert werden. Dies erfordert die folgenden Schritte:

  1. Rufen Sie ein signiertes Zertifikat ab, und installieren Sie dieses so, wie es für die Verbindungsdienste ssljms, ssladmin oder cluster im Message Queue Administration Guide beschrieben wird.

  2. Installieren Sie das Root-Zertifizierungsstellenzertifikat im Vertrauensspeicher, falls erforderlich.

  3. Fügen Sie den ssljmxrmi-Connector zur Liste der JMX-Connectors hinzu, damit dieser beim Broker-Start aktiviert wird:

    imq.jmx.connector.activelist=jmxrmi,ssljmxrmi

  4. Starten Sie den Broker mit dem Message Queue-Dienstprogramm Broker (imqbrokerd), indem Sie diesem entweder das Schlüsselspeicher-Passwort in einer Passwortdatei übergeben oder es bei Aufforderung in die Befehlszeile eingeben.

  5. Standardmäßig ist der ssljmxrmi-Connector (oder jeder andere SSL-basierte Connector) konfiguriert, um sämtliche bereitgestellten Broker-SSL-Zertifikate zu validieren. Um diese Validierung zu verhindern (wenn Sie z. B. selbst signierte Zertifikate beim Testen von Software verwenden), setzen Sie die Broker-Eigenschaft imq.jmx.connector.ssljmxrmi.brokerHostTrusted auf true.

Auf Clientseite muss das Administrator-Verbindungsfactory (AdminConnectionFactory) mit einer URL konfiguriert sein, die ssljmxrmi als bevorzugten Connector angibt:

AdminConnectionFactory  acf = new AdminConnectionFactory();
acf.setProperty(AdminConnectionConfiguration.imqAddress, "mq://myhost:7676/ssljmxrmi");

Verwenden Sie erforderlichenfalls die Systemeigenschaften javax.net.ssl.trustStore und javax.net.ssl.trustStorePassword, um den JMX-Client mit dem Vertrauensspeicher zu verknüpfen.

Protokollierung zur Client-Laufzeit

In diesem Abschnitt wird die Message Queue 4.0-Unterstützung für die Protokollierung von verbindungs- und sitzungsbezogenen Ereignissen zur Client-Laufzeit beschrieben.

JDK 1.4 (und höher) enthält die java.util.logging-Bibliothek. Diese Bibliothek implementiert eine standardmäßige Protokollschnittstelle, die zur anwendungsspezifischen Protokollierung verwendet werden kann.

Die Message Queue-Client-Laufzeit nutzt die Java-Protokoll-API, um deren Protokollierungsfunktionen zu implementieren. Sie können sämtliche J2SE 1.4-Protokolloptionen zum Konfigurieren der Protokollierungsaktivitäten verwenden. Beispielsweise können von einer Anwendung die folgenden Java-Protokolloptionen verwendet werden, um festzulegen, wie die Protokollinformationen von der Message Queue-Client-Laufzeit ausgegeben werden:

Weitere Informationen zur Java-Protokoll-API finden Sie in der Übersicht über die Java-Protokollierung unter http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/overview.html

Protokollnamensräume, -ebenen und -aktivitäten

Der Message Queue-Anbieter definiert mehrere Protokollnamensräume, die mit Protokollebenen und Protokollaktivitäten verknüpft sind, über die Message Queue-Clients Verbindungs- und Sitzungsereignisse protokollieren können, sofern die Protkollkonfiguration entsprechend festgelegt wurde.

Der Root-Protokollnamensraum für die Message Queue-Client-Laufzeit ist als javax.jms definiert. Für alle Protokolle in der Message Queue-Client-Laufzeit wird dieser Name als übergeordneter Namensraum verwendet.

Die für die Message Queue-Client-Laufzeit verwendeten Protokollebenen stimmen mit denen überein, die in der java.util.logging.Level-Klasse definiert sind. Diese Klasse definiert sieben Standardprotokollebenen und zwei zusätzliche Einstellungen, über die Sie die Protokollierung aktivieren bzw. deaktivieren können.

OFF

Deaktiviert die Protokollierung.

SEVERE

Höchste Priorität, höchster Wert. Anwendungsdefiniert.

WARNING

Anwendungsdefiniert.

INFO

Anwendungsdefiniert.

CONFIG

Anwendungsdefiniert.

FINE

Anwendungsdefiniert.

FINER

Anwendungsdefiniert.

FINEST

Niedrigste Priorität, niedrigster Wert. Anwendungsdefiniert.

ALL

Aktiviert die Protokollierung aller Nachrichten.

Im Allgemeinen werden Ausnahmen und Fehler, die zur Message Queue-Client-Laufzeit auftreten, im Protokoll mit dem javax.jms-Namensraum erfasst.

In den folgenden Tabellen sind die Ereignisse aufgelistet, die protokolliert werden können, sowie die Protokollebene, die festgelegt werden muss, um Ereignisse für JMS-Verbindungen und für Sitzungen zu protokollieren.

Die folgende Tabelle enthält Beschreibungen der Protokollebenen und Ereignisse für Verbindungen.

Tabelle 1–6 Protokollebenen und Ereignisse für den javax.jms.connection -Namensraum

Protokollebene 

Ereignisse 

FINE

Verbindung erstellt 

FINE

Verbindung geöffnet 

FINE

Verbindung geschlossen 

FINE

Verbindung unterbrochen 

FINE

Verbindung wiederhergestellt 

FINER

Diverse Verbindungsaktivitäten wie z. B. setClientID

FINEST

Nachrichten, Bestätigungen, Message Queue-Aktion und Steuerungsmeldungen (wie das Durchführen einer Transaktion)  

Für Sitzungen werden die folgenden Informationen im Protokolleintrag erfasst.

Die folgende Tabelle enthält Beschreibungen der Protokollebenen und Ereignisse für Sitzungen.

Tabelle 1–7 Protokollebenen und Ereignisse für den javax.jms.session -Namensraum

Protokollebene 

Ereignis 

FINE

Sitzung erstellt 

FINE

Sitzung geschlossen 

FINE

Produzent erstellt 

FINE

Konsument erstellt 

FINE

Ziel erstellt 

FINER

Diverse Sitzungaktivitäten wie z. B. das Durchführen einer Sitzung. 

FINEST

Produzierte und konsumierte Nachrichten. (Nachrichteneigenschaften und -texte werden in den Protokolleinträgen nicht erfasst.) 

Die Ausgabeprotokollebene wird standardmäßig aus der JRE übernommen, in der die Anwendung ausgeführt wird. Überprüfen Sie die Datei JRE_DIRECTORY/lib/logging.properties , um diese Ebene zu bestimmen.

Sie haben die Möglichkeit, die Protokollierung programmatisch oder mithilfe von Konfigurationsdateien zu konfigurieren. Zudem können Sie den Umfang der Protokollierung steuern. In den folgenden Abschnitten werden diese Möglichkeiten erläutert.

Verwenden der Konfigurationsdatei für das JRE-Protokoll

Das folgende Beispiel zeigt, wie Protokollnamensräume und -ebenen in der Datei JRE_DIRECTORY/lib/logging.properties angegeben werden, die verwendet wird, um die Protokollebene für die Java Runtime Environment festzulegen. Sämtliche Anwendungen, die diese JRE verwenden, verfügen über dieselbe Protokollkonfiguration. In der nachstehenden Beispielkonfiguration wird die Protokollebene für den javax.jms.connection -Namensraum auf INFO gesetzt, und angegeben, dass die Ausgabe in java.util.logging.ConsoleHandler geschrieben werden soll.

#logging.properties file.
# "Handler" geben eine durch Kommas getrennte Liste der Protokoll-Handler-Klassen 
# an. Diese Handler werden während des VM-Starts installiert.
# Beachten Sie, dass sich diese Klassen im selben Systemklassenpfad befinden müssen.
# Standardmäßig wird nur ein ConsoleHandler konfiguriert, der
# nur Meldungen auf INFO-Ebene und höheren Ebenen anzeigt.

	handlers= java.util.logging.ConsoleHandler

# Standardmäßige globale Protokollebene.
# Dies gibt an, welche Ereignisse in allen Protokollen
# erfasst werden. Für jede vorgegebene Funktion kann diese allgemene Ebene
# von einer funktionsspezifischen Ebene überschrieben werden.
# Beachten Sie, dass der ConsoleHandler ebenfalls über eine separate Ebeneneinstellung verfügt,
# über die in der Konsole gedruckten Meldungen eingeschänkt werden können.

    .level= INFO

# Grenzen Sie die Meldungen ein, die auf der Konsole für INFO und höher gedruckt werden.

    java.util.logging.ConsoleHandler.level = INFO
    java.util.logging.ConsoleHandler.formatter = 
                                    java.util.logging.SimpleFormatter

# Bei der Protokollierung mit javax.jms.connection-Namensraum
# werden Level.INFO-Nachrichten für die entsprechenden Ausgabe-Handler geschrieben.
# In dieser Konfiguration ist der Ausgabe-Handler auf java.util.logging.ConsoleHandler gesetzt.

    javax.jms.connection.level = INFO

Verwenden einer Protokollierungskonfigurationsdatei für eine bestimmte Anwendung

Sie können zudem eine Protokollierungskonfigurationsdatei über die Java-Befehlszeile definieren, die Sie verwenden, um eine Anwendung auszuführen. Die Anwendung wird dann die Konfiguration in der angegebenen Protokolldatei verwenden. Im folgenden Beispiel verwendet configFile dasselbe Format, das in der Datei JRE_DIRECTORY/lib/logging.properties definiert ist.

java -Djava.util.logging.config.file=configFile MQApplication

Programmatisches Festlegen der Protokollkonfiguration

Im folgenden Code wird die java.util.logging-API zum Protokollieren von Verbindungsereignissen verwendet, indem die Protokollebene für den javax.jms.connection-Namensraum auf FINE geändert wird. Sie können einen solchen Code in die Anwendung einfügen, um die Protokollkonfiguration programmatisch festzulegen.

import java.util.logging.*;
//einen Datei-Handler erzeugen und in der mq.log-Datei 
//im Temp-Verzeichnis des Systems ausgeben.

    Handler fh = new FileHandler("%t/mq.log");
    fh.setLevel (Level.FINE);

//Protokoll für Domäne "javax.jms.connection" abrufen.

    Logger logger = Logger.getLogger("javax.jms.connection");
    logger.addHandler (fh);

//javax.jms.connection-Protokollierung würde Aktivitäten 
//der Ebene FINE und höher erfassen.

    logger.setLevel (Level.FINE);

Verbindungsereignisbenachrichtigung

Verbindungsereignisbenachrichtigungen ermöglichen einem Message Queue-Client das Schließen und erneute Verbinden von Ereignissen zu überwachen und dem Benachrichtigungstyp und Verbindungsstatus entsprechende Aktionen auszuführen. Wenn es beispielsweise zu einem Failover kommt und der Client mit einem anderen Broker erneut verbunden wird, wird in einer Anwendung möglicherweise der Transaktionsstatus bereinigt, um mit einer neuen Transaktion fortzufahren.

Wenn der Message Queue-Anbieter ein schwerwiegendes Problem mit einer Verbindung ermittelt, ruft dieser den registrierten Ausnahme-Listener des Verbindungsobjekts auf. Er ruft die onException-Methode des Listeners auf, und übergibt dieser ein JMSException-Argument, welches das Problem beschreibt. Der Message Queue-Anbieter bietet zudem eine Ereignisbenachrichtigungs-API, die es der Client-Laufzeit ermöglicht, die Anwendung über Änderungen des Verbindungsstatus zu informieren. Die Benachrichtigungs-API wird durch die folgenden Elemente definiert:

In den folgenden Abschnitten werden die Ereignisse beschrieben, die Benachrichtigungen auslösen können, und wie ein Ereignis-Listener erstellt wird.

Verbindungsereignisse

In der folgenden Tabelle sind die Ereignisse aufgelistet und beschrieben, die vom Ereignis-Listener zurückgegeben werden können.

Beachten Sie, dass der JMS-Ausnahme-Listener nicht aufgerufen wird, wenn ein Verbindungsereignis ausgelöst wird. Der Ausnahme-Listener wird nur dann aufgerufen, wenn die Client-Laufzeit die maximale Anzahl an Versuchen zum Wiederherstellen der Verbindung erreicht hat. Die Client-Laufzeit ruft den Ereignis-Listener immer vor dem Ausnahme-Listener auf.

Tabelle 1–8 Benachrichtigungsereignisse

Ereignistyp 

Bedeutung 

ConnectionClosingEvent

Die Message Queue-Client-Laufzeit generiert dieses Ereignis, sobald sie die Benachrichtigung vom Broker empfängt, dass eine Verbindung aufgrund einer Administratoranforderung zum Herunterfahren geschlossen wird. 

ConnectionClosedEvent

Die Message Queue-Client-Laufzeit generiert dieses Ereignis, sobald eine Verbindung aufgrund eines Broker-Fehlers geschlossen wird oder diese aufgrund einer Administratoranforderung zum Herunterfahren oder Neustarten geschlossen wird. 

Wenn ein Ereignis-Listener ein ConnectionClosedEvent-Ereignis empfängt, kann die Anwendung mithilfe der getEventCode()-Methode des empfangenen Ereignisses einen Ereigniscode abrufen, der die Ursache für den Schließvorgang angibt.

ConnectionReconnectedEvent

Die Verbindung der Message Queue-Client-Laufzeit und einem Broker wurde wiederhergestellt. Hierbei kann es sich um denselben Broker handeln, mit dem der Client zuvor bereits verbunden war, oder um einen anderen Broker.  

Eine Anwendung kann mithilfe der getBrokerAddress-Methode des empfangenen Ereignisses die Adresse des Brokers abrufen, mit dem diese erneut verbunden wurde.

ConnectionReconnectFailedEvent

Die Verbindung zwischen der Message Queue-Client-Laufzeit und einem Broker konnte nicht wiederhergestellt werden. Bei jedem fehlgeschlagenen Verbindungsversuch generiert die Laufzeit ein neues Ereignis und sendet dieses zum Ereignis-Listener. 

Der JMS-Ausnahme-Listener wird nicht aufgerufen, wenn ein Verbindungsereignis ausgelöst wird. Er wird nur dann aufgerufen, wenn die Client-Laufzeit die maximale Anzahl an Versuchen zum Wiederherstellen der Verbindung erreicht hat. Die Client-Laufzeit ruft den Ereignis-Listener immer vor dem Ausnahme-Listener auf.  

Erstellen eines Ereignis-Listeners

Das folgende Codebeispiel zeigt, wie ein Verbindungs-Ereignis-Listener festgelegt wird. Bei jedem Verbindungsereignis wird die onEvent -Methode des Ereignis-Listeners von der Client-Laufzeit aufgerufen.

//MQ-Verbindungsfactory erstellen.

com.sun.messaging.ConnectionFactory factory =
        new com.sun.messaging.ConnectionFactory();

//MQ-Verbindung erstellen.

com.sun.messaging.jms.Connection connection = 
       (com.sun.messaging.jms.Connection )factory.createConnection();

//MQ -Ereignis-Listener erstellen. Der Listener implementiert
//com.sun.messaging.jms.notification.EventListener-Schnittstelle.

com.sun.messaging.jms.notification.EventListener eListener = 
       new ApplicationEventListener();

//Ereignis-Listener für MQ-Verbindung festlegen.

connection.setEventListener ( eListener );

Beispiele für Ereignis-Listener

In diesem Beispiel erfasst der Ereignis-Listener der Anwendung das Verbindungsereignis im Protokollsystem der Anwendung:

public class ApplicationEventListener implementiert
				com.sun.messaging.jms.notification.EventListener {

public void onEvent ( com.sun.messaging.jms.notification.Event connEvent ) {
      	log (connEvent);
}
private void log ( com.sun.messaging.jms.notification.Event connEvent ) {
	      String eventCode = connEvent.getEventCode(); 
      	String eventMessage = connEvent.getEventMessage();
    	  //Ereignisinformationen in den Ausgabe-Stream schreiben
     	}
}