Sun Java System Message Queue 4.1 リリースノート

4.0 リリースでの新機能

Message Queue 4.0 に含まれる新機能は次のとおりです。

以降の節で、これらの機能について説明しています。


注意 – 注意 –

version 4.0 には、軽度とはいえ、状況によって十分な対応が必要になる変更が導入されています。その 1 つとして、パスワードを指定するコマンド行オプションが使用されなくなったことが挙げられます。今後は、「使用されなくなったパスワードオプション」で説明するように、すべてのパスワードをファイルに保存する必要があります。


C API および C クライアントランタイムのインタフェースの変更

Message Queue の Version 4.0 では、デッドメッセージキューに配置されたすべてのメッセージで設定される 2 つの新しいプロパティーが追加されています。

Java API および Java クライアントランタイムのインタフェースの変更

Message Queue の Version 4.0 では、デッドメッセージキューに配置されたすべてのメッセージに設定される 2 つの新しいプロパティーが追加されています。

持続ストアに関する情報の表示

imqdbmgr コマンドに query サブコマンドが追加されました。このサブコマンドは、持続ストアの情報 (ストアバージョン、データベースユーザー、データベーステーブルが作成されたかどうかなど) を表示するために使用します。

次に、このコマンドによって表示される情報の例を示します。


imqdbmgr query

[04/Oct/2005:15:30:20 PDT] Using plugged-in persistent store:
        version=400
        brokerid=Mozart1756
        database connection url=jdbc:oracle:thin:@Xhome:1521:mqdb
        database user=scott
Running in standalone mode.
Database tables have already been created.

持続ストアの形式の変更

Message Queue の Version 3.7 UR1 では、パフォーマンスを向上するために持続ストアの形式に 2 つの変更が加えられました。1 つはファイルストアに対する変更で、もう 1 つは JDBC ストアに対する変更です。

これらの変更がストアの互換性にも影響し、Message Queue version 3.7 UR1 では、ファイルストアと JDBC ストアの両方のストアバージョンが 350 から 370 に変更されました。

Message Queue version 4.0 では、最適化と将来の機能拡張をサポートするために、JDBC ストアが変更されました。このため、JDBC ストアのバージョンが 400 になりました。ただし Version 4.0 では、ファイルベースの持続ストアには変更が行われていないため、このファイルストアのバージョンは 370 のままです。

Message Queue 4.0 は、ファイルベースの持続ストアと JDBC の持続ストアの最新バージョンへの持続ストアの自動変換をサポートしています。imqbrokerd を最初に起動したときに、ユーティリティーが古いバージョンのストアを検出した場合、古いストアはそのままで、ストアを新しい形式に移行します。

このアップグレードをロールバックする必要のある場合は、Message Queue 4.0 をいったんアンインストールして、以前実行していたバージョンを再インストールします。ストアの古いコピーはそのまま残っているので、ブローカはストアの古いコピーを実行できます。

ブローカ管理

コマンドユーティリティー (imqcmd) に、サブコマンドといくつかのオプションが追加されました。管理者はこれらを使用して、ブローカを休止したり、指定した間隔の後でブローカをシャットダウンしたり、接続を破棄したり、Java システムのプロパティー (たとえば、コネクション関連のプロパティー) を設定したりできます。

imqcmd コマンドの構文の詳細は、『Sun Java System Message Queue 4.1 Administration Guide』の第 13 章「Command Line Reference」を参照してください。

JDBC 持続サポート

Apache Derby Version 10.1.1 が、JDBC 準拠の持続ストアプロバイダとしてサポートされるようになりました。

SSL サポート

release 4.0 から、クライアントコネクションファクトリのプロパティー imqSSLIsHostTrusted のデフォルト値が false になりました。使用しているアプリケーションが以前のデフォルト値の true に依存している場合は、再設定を行い、プロパティーを明示的に true に設定する必要があります。

ブローカが自己署名付き証明書を使用するように設定されているときは、ホストを信頼することもできます。この場合、接続で SSL ベースの接続サービスを使用するように指定する (imqConnectionType プロパティーを使用する) ことに加えて、imqSSLIsHostTrusted プロパティーを true に設定することをお勧めします。

たとえば、ブローカが自己署名付き証明書を使用するときに安全にクライアントアプリケーションを実行するには、次のようなコマンドを使用します。

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

ブローカが自己署名付き証明書を使用するときに安全に管理ツール imqcmd を実行するには、次のようなコマンドを使用します。

imqcmd list svc -secure -DimqSSLIsHostTrusted=true

JMX サポート

Java Management Extensions (JMX) 仕様に準拠して、Message Queue ブローカを設定および監視するための新しい API が追加されました。この API を使用すると、Message Queue クライアントアプリケーション内部からプログラムによってブローカ関数を設定および監視することができます。以前のバージョンの Message Queue では、これらの関数にはコマンド行または管理コンソールからしかアクセスできませんでした。

この API は、一連の JMX Managed Bean (MBean) によって設定されており、次の Message Queue 関連のリソースを管理します。

これらの MBean によって、基礎となるリソースの状態を、同期をとりながらポーリングおよび操作するための属性操作が設定されます。また、状態が変更されたときに、クライアントアプリケーションが非同期で待機して応答できるようにする通知も設定されます。JMX API を使用して、クライアントアプリケーションは次のようなタスクを設定および監視することができます。

JMX API の紹介と詳細情報については、『Sun Java System Message Queue 4.1 Developer’s Guide for JMX Clients』を参照してください。

ブローカサポート: JMX 関連のプロパティー

JMX API をサポートするために、いくつかの新しいブローカプロパティーが追加されました (表 1–3 を参照)。これらのプロパティーはいずれも Message Queue コマンドユーティリティー (imqcmd) によるコマンド行からは設定できません。その代わりに、ブローカユーティリティー (imqbrokerd) の -D オプションを使用するか、ブローカのインスタンス設定ファイル ( config.properties) を手作業で編集することで設定できます。さらに、これらのプロパティーのいくつか (imq.jmx.rmiregistry.start imq.jmx.rmiregistry.use imq.jmx.rmiregistry.port) は、表 1–4 に示されている新しいブローカユーティリティーオプションを使用して設定できます。次の表は、各オプションとその型、それぞれの使用方法について示しています。

表 1–3 JMX サポートのための新しいブローカプロパティー

プロパティー 

型 

説明 

imq.jmx.rmiregistry.start

ブール型

ブローカの起動時に RMI レジストリを起動するかどうかを指定します。

true の場合、ブローカは imq.jmx.rmiregistry.port によって指定されたポートで RMI レジストリを起動し、これを使用して JMX コネクタ用の RMI スタブを格納します。この場合、imq.jmx.rmiregistry.use の値は無視されます。

デフォルト値 : false

imq.jmx.rmiregistry.use

ブール型

外部の RMI レジストリを使用するかどうかを指定します。

imq.jmx.rmiregistry.start false の場合のみ適用されます。

true の場合、ブローカは imq.jmx.rmiregistry.port によって指定されたポートで外部の RMI レジストリを使用し、JMX コネクタ用の RMI スタブを格納します。この外部の RMI レジストリは、ブローカの起動時にすでに実行されている必要があります。

デフォルト値 : false

imq.jmx.rmiregistry.port

整数

RMI レジストリのポート番号

imq.jmx.rmiregistry.start または imq.jmx.rmiregistry.use true の場合のみ適用されます。このポート番号を JMX サービス URL の URL パスに追加することによって、JMX コネクタが RMI レジストリを使用するように設定できます。

デフォルト値 : 1099

imq.jmx.connector.list

文字列

事前設定された JMX コネクタの名前。コンマで区切られます。

デフォルト値 : jmxrmi,ssljmxrmi

imq.jmx.connector.activelist

文字列

ブローカの起動時にアクティブになる JMX コネクタの名前。コンマで区切られます。

デフォルト値 : jmxrmi

imq.jmx.connector.connectorName .urlpath

文字列

コネクタ connectorName の、JMX サービス URL の urlPath コンポーネント

JMX サービス URL パスが明示的に指定されている場合 (共有の外部 RMI レジストリが使用されている場合など) に有効です。

デフォルト値 : JMX コネクタ用の RMI スタブを格納するために RMI レジストリが使用されている場合 (つまり imq.jmx.registry.start または imq.jmx.registry.usetrue の場合)

   /jndi/rmi://brokerHost:rmiPort
      /brokerHost/brokerPort/connectorName

RMI レジストリが使用されていない場合 (デフォルトの場合。つまり、 imq.jmx.registry.start imq.jmx.registry.use の両方が false の場合):

   /stub/rmiStub

ここで rmiStub は、RMI スタブそのものをエンコードおよび直列化した表現です。

 

imq.jmx.connector.connectorName .useSSL

ブール型

コネクタ connectorName に Secure Socket Layer (SSL) を使用するかどうかを指定します。

デフォルト値 : false

imq.jmx.connector.connectorName .brokerHostTrusted

ブール型

コネクタ connectorName のブローカによって提示された任意の証明書を信頼するかどうかを指定します。

imq.jmx.connector. connectorName.useSSL true の場合のみ適用されます。

false の場合、Message Queue クライアントランタイムは提示されたすべての証明書を検証します。証明書の署名者がクライアントのトラストストア内に存在しない場合、検証は失敗します。

true の場合、証明書の検証はスキップされます。これは、ソフトウェアのテスト中で自己署名した証明書が使用されている場合などに便利です。

デフォルト値 : false

imq.jmx.connector.list プロパティーは、ブローカの起動時に作成される一連の名前付き JMX コネクタを定義します。imq.jmx.connector.activelist では、これらの中でアクティブにするものを指定します。名前付きのコネクタには、それぞれ独自のプロパティーセットがあります。

imq.jmx.connector.connectorName .urlpath

imq.jmx.connector.connectorName .useSSL

imq.jmx.connector.connectorName .brokerHostTrusted

デフォルトでは、 jmxrmi および ssljmxrmi という名前の 2 つの JMX コネクタが作成されます。前者は SSL 暗号化を使用しないように設定 (imq.jmx.connector.jmxrmi.useSSL = false) され、後者は使用するように設定 (imq.jmx.connector.ssljmxrmi.useSSL = true) されています。デフォルトでは、ブローカの起動時には jmxrmi コネクタのみがアクティブになります。通信のセキュリティー保護のために ssljmxrmi コネクタをアクティブにする方法については、「JMX クライアント用の SSL サポート」を参照してください。

使いやすくするために、コマンド行のブローカユーティリティー (imqbrokerd) にも、RMI レジストリの使用方法、起動、ポートを制御するための新しいオプション (表 1–4) が追加されています。これらのオプションの使用方法と効果は、表 1–3 に示されているブローカプロパティーの中の対応するものと同じです。次の表では、各オプションとともに対応するブローカプロパティーを示し、その使用方法についても説明します。

表 1–4 JMX サポートのための新しいブローカユーティリティーオプション

オプション 

対応するブローカプロパティー 

説明 

-startRmiRegistry

imq.jmx.rmiregistry.start

ブローカの起動時に RMI レジストリを起動するかどうかを指定します。

-useRmiRegistry

imq.jmx.rmiregistry.use

外部の RMI レジストリを使用するかどうかを指定します。

-rmiRegistryPort

imq.jmx.rmiregistry.port

RMI レジストリのポート番号

ブローカの起動時に作成および起動される JMX コネクタの JMX サービス URL を表示するために、コマンド行のコマンドユーティリティー (imqcmd) に新しいサブコマンド (表 1–5) が追加されました。この情報は、JMX コネクタを取得するために Message Queue の簡易クラス AdminConnectionFactory を使用しない JMX クライアントにとって必要になります。また、Java Monitoring and Management Console ( jconsole) などの汎用の JMX ブラウザを介して Message Queue を管理または監視するために使用することもできます。

表 1–5 新しいコマンドユーティリティーのサブコマンド

サブコマンド 

説明 

list jmx

JMX コネクタの JMX サービス URL を表示します

JMX クライアント用の SSL サポート

これまでに説明したように、Message Queue のメッセージブローカは、デフォルトでは、事前に設定済みの JMX コネクタ jmxrmi を使用して、セキュリティー保護されていない通信用に設定されています。通信のセキュリティー保護のために SSL (Secure Socket Layer) を使用する必要のあるアプリケーションでは、代わりにセキュリティー保護された JMX コネクタである ssljmxrmi をアクティブにする必要があります。このためには次の手順を実行する必要があります。

  1. Message Queue 管理ガイド』に示されている ssljmsssladmin、または cluster 接続サービスと同じ方法で、署名済みの証明書を取得およびインストールします。

  2. 必要に応じて、ルート CA 証明書をトラストストア内にインストールします。

  3. ブローカの起動時にアクティブになるように、JMX コネクタのリストに ssljmxrmi コネクタを追加します。

    imq.jmx.connector.activelist=jmxrmi,ssljmxrmi

  4. Message Queue ブローカユーティリティー (imqbrokerd) をパスワードファイル内のキーストアパスワードに渡すか、プロンプト表示されるコマンド行から入力して、ブローカを起動します。

  5. デフォルトでは、ssljmxrmi コネクタ、またはその他の SSL ベースのコネクタ は、提示されるすべてのブローカ SSL 証明書を検証するように設定されています。この検証を回避する場合、ソフトウェアのテスト中で自己署名の証明書を使用している場合などは、ブローカプロパティー imq.jmx.connector.ssljmxrmi.brokerHostTrusted true に設定します。

クライアント側では、ssljmxrmi を優先コネクタとして指定した URL を使用して管理者のコネクションファクトリ (AdminConnectionFactory ) を設定する必要があります。

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

必要に応じて、システムプロパティー javax.net.ssl.trustStore および javax.net.ssl.trustStorePassword を使用して、JMX クライアントをトラストストアにポイントします。

クライアントランタイムログ

この節では、Message Queue 4.0 による接続のクライアントランタイムログのサポートと、セッション関連のイベントについて説明します。

JDK 1.4 以上には、java.util.logging ライブラリが含まれています。このライブラリは、アプリケーション固有のログに使用される標準のロガーインタフェースを実装しています。

Message Queue のクライアントランタイムは Java Logging API を使用してログ機能を実装します。ログ活動を設定するために、すべての J2SE 1.4 ロギング機能を使用できます。たとえば、Message Queue クライアントランタイムがログ情報を出力する方法を設定するために、アプリケーションは次の Java ロギング機能を使用することができます。

Java Logging API の詳細は、http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/logging/overview.html にある Java ロギングの概要を参照してください。

ログの名前空間、レベル、活動

Message Queue プロバイダは、ログレベルやログ活動に関連付けて一連のログの名前空間を定義します。Message Queue クライアントは、ログ設定が適切であれば、この名前空間を使用して接続やセッションイベントをログに記録することができます。

Message Queue クライアントランタイムのルートのログ名前空間は、javax.jms と定義されます。Message Queue クライアントランタイム内のすべてのロガーが、この名前を親の名前空間として使用します。

Message Queue クライアントランタイムに使用されるログレベルは、java.util.logging.Level クラス内で定義されるものと同じです。このクラスでは、7 つの標準ログレベルと、ログのオン/オフに使用できる 2 つの追加設定が定義されます。

OFF

ログをオフにします。

SEVERE

優先順位が最高である最高値。アプリケーションで定義します。

WARNING

アプリケーションで定義します。

INFO

アプリケーションで定義します。

CONFIG

アプリケーションで定義します。

FINE

アプリケーションで定義します。

FINER

アプリケーションで定義します。

FINEST

優先順位が最低である最低値。アプリケーションで定義します。

ALL

すべてのメッセージのログを有効にします。

一般に、Message Queue クライアントランタイム内で発生した例外やエラーは、名前空間 javax.jms を使用するロガーによってログ記録されます。

以下の表は、JMS コネクションとセッションについて、ログ記録できるイベントとログイベントに対して設定する必要のあるログレベルを示しています。

次の表は、コネクションのログレベルとイベントについて示したものです。

表 1–6 名前空間 javax.jms.connection のログレベルとイベント

ログレベル 

イベント 

FINE

接続が作成されました 

FINE

接続が起動しました 

FINE

接続が閉じました 

FINE

接続が破棄されました 

FINE

再接続されました 

FINER

その他の接続アクティビティー (setClientID など)

FINEST

メッセージ、通知、Message Queue アクション、制御メッセージ (トランザクションのコミットなど) 

セッションの場合、次の情報がログレコードに記録されます。

次の表は、セッションのログレベルとイベントについて示したものです。

表 1–7 名前空間 javax.jms.session のログレベルとイベント

ログレベル 

イベント 

FINE

セッションが作成されました 

FINE

セッションが閉じました 

FINE

プロデューサが作成されました 

FINE

コンシューマが作成されました 

FINE

送信先が作成されました 

FINER

その他のセッションアクティビティー (セッションのコミットなど)。 

FINEST

メッセージがプロデュースされ、消費されました。(メッセージのプロパティーと本文はログレコードに記録されません。) 

デフォルトでは、出力ログレベルはアプリケーションの実行されている JRE から継承されます。JRE_DIRECTORY/lib/logging.properties ファイルを参照してレベルを確認してください。

ログはプログラムや設定ファイルを使用して設定できます。また、ログの発生する範囲を制御することもできます。次の節では、これらの機能について説明します。

JRE ロギング設定ファイルの使用

次の例は、JRE_DIRECTORY/lib/logging.properties ファイル内でログの名前空間とログレベルを設定する方法を示しています。この方法は Java ランタイム環境のログレベルの設定に使用されます。JRE を使用するすべてのアプリケーションが同じログ設定になります。次に示すサンプル設定では、名前空間 javax.jms.connection のログレベルをINFO に設定し、その出力が java.util.logging.ConsoleHandler に書き込まれるように指定しています。

#logging.properties file.
# "handlers" specifies a comma separated list of log Handler 
# classes. These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.

	handlers= java.util.logging.ConsoleHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility-specific level.
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.

    .level= INFO

# Limit the messages that are printed on the console to INFO and above.

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

# The logger with javax.jms.connection name space will write
# Level.INFO messages to its output handler(s). In this configuration 
# the ouput handler is set to java.util.logging.ConsoleHandler.

    javax.jms.connection.level = INFO

特定のアプリケーションに対するログ設定ファイルの使用

アプリケーションの実行に使用する Java コマンド行からログ設定ファイルを定義することもできます。このアプリケーションは、指定のログファイル内で定義された設定を使用します。次の例では、configFile JRE_DIRECTORY/lib/logging.properties ファイル内で定義されているものと同じ形式を使用します。

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

プログラムによるログ設定

次のコードでは、java.util.logging API を使用して、javax.jms.connection 名前空間のログレベルを FINE に変更することで、接続イベントをログ記録しています。このようなコードをアプリケーションに追加して、プログラムによるログ設定を行うことができます。

import java.util.logging.*;
//construct a file handler and output to the mq.log file 
//in the system's temp directory.

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

//Get Logger for "javax.jms.connection" domain.

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

//javax.jms.connection logger would log activities   
//with level FINE and above.

    logger.setLevel (Level.FINE);

接続イベント通知

接続イベント通知を使用すると、Message Queue クライアントは接続のクローズおよび再接続イベントを待機して、通知タイプと接続状態に基づいて適切なアクションを起こすことができます。たとえば、フェイルオーバーが発生してクライアントが別のブローカに再接続された場合、アプリケーションはそのトランザクションの状態をクリーンアップしてから新しいトランザクションに進む必要があるかもしれません。

Message Queue プロバイダは、接続について深刻な問題を検出した場合、接続オブジェクトの登録済みの例外リスナーを呼び出します。このプロバイダは、リスナーの onException メソッドを呼び出し、問題を記述する JMSException 引数にこれを渡します。Message Queue プロバイダはイベント通知 API も提供し、これを使用してクライアントランタイムは、接続状態の変更をアプリケーションに通知できます。通知 API は次の要素によって定義されます。

次の節では、通知をトリガーできるイベントと、イベントリスナーの作成方法について説明します。

接続イベント

次の表は、イベントリスナーによって返されるイベントについて説明したものです。

接続イベントの発生時に JMS 例外リスナーは呼び出されません。例外リスナーが呼び出されるのは、クライアントランタイムの再接続の試行回数が上限に達してしまった場合のみです。クライアントランタイムは、常に例外リスナーの前にイベントリスナーを呼び出します。

表 1–8 通知イベント

イベント タイプ 

意味 

ConnectionClosingEvent

Message Queue クライアントランタイムは、管理者のシャットダウン要求によって接続がクローズされようとしているという通知をブローカから受信したときに、このイベントを生成します。 

ConnectionClosedEvent

Message Queue クライアントランタイムは、ブローカのエラーによって接続がクローズされたか、管理者のシャットダウン要求または再起動要求によって接続がクローズされたときに、このイベントを生成します。 

イベントリスナーが ConnectionClosedEvent を受信すると、アプリケーションは受信したイベントの getEventCode() メソッドを使用して、クローズの原因を指定するイベントコードを取得します。

ConnectionReconnectedEvent

Message Queue クライアントランタイムがブローカに再接続されました。このブローカは、このクライアントが以前接続していたものと同じ場合もありますが、別のブローカの場合もあります。 

アプリケーションは、受信したイベントの getBrokerAddress メソッドを使用して、再接続先のブローカのアドレスを取得することができます。

ConnectionReconnectFailedEvent

Message Queue クライアントランタイムがブローカへの再接続に失敗しました。再接続の試みに失敗するたびに、ランタイムは新しいイベントを生成し、それをイベントリスナーに配信します。 

接続イベントの発生時に JMS 例外リスナーは呼び出されません。呼び出されるのは、クライアントランタイムの再接続の試行回数が上限に達してしまった場合のみです。クライアントランタイムは、常に例外リスナーの前にイベントリスナーを呼び出します。 

イベントリスナーの作成

次のコード例は、接続イベントリスナーの設定方法を示したものです。接続イベントが発生するたびに、イベントリスナーの onEvent メソッドがクライアントランタイムによって呼び出されます。

//create an MQ connection factory.

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

//create an MQ connection.

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

//construct an MQ event listener.  The listener implements 
//com.sun.messaging.jms.notification.EventListener interface.

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

//set event listener to the MQ connection.

connection.setEventListener ( eListener );

イベントリスナーの例

この例では、アプリケーションが、そのイベントリスナーが接続イベントをアプリケーションのロギングシステムに記録するように選択します。

public class ApplicationEventListener implements
				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();
    	  //write event information to the output stream.
     	}
}