Application Server は、Sun Java System Message Queue (従来の Sun ONE Message Queue) を Application Server に統合することによって Java Message Service (JMS) API を実装します。基本的な JMS API 管理タスクには、Application Server の管理コンソールを使用します。Message Queue クラスタの管理などの高度なタスクには、MQ-as-install/imq/bin ディレクトリに用意されたツールを使用します。Message Queue の管理の詳細については、『Message Queue Administration Guide』を参照してください。
この章では、Java Message Service (JMS) API を使用するアプリケーションのリソースを設定する方法について説明します。この章の内容は次のとおりです。
JMS (Java Message Service) API は、次の 2 種類の管理対象オブジェクトを使用します。
接続ファクトリ。アプリケーションがプログラムでほかの JMS オブジェクトを作成できるようにするオブジェクトです。
送信先。メッセージのリポジトリとして機能します。
オブジェクトは管理された上で作成され、その作成方法は JMS の実装に固有になります。Application Server で、次のタスクを実行します。
JMS アプリケーションは、JNDI API を使用して接続ファクトリと送信先リソースにアクセスします。通常、JMS アプリケーションは 1 つ以上の接続ファクトリと 1 つ以上の宛先を使用します。作成するリソースを確認するには、アプリケーションを理解したり、アプリケーションの開発者の意見を確認したりすることをお勧めします。
接続ファクトリには次の 3 つのタイプがあります。
ポイントツーポイント通信で使用する QueueConnectionFactory オブジェクト
パブリッシュ - サブスクライブ通信で使用する TopicConnectionFactory オブジェクト
ポイントツーポイント通信とパブリッシュ - サブスクライブ通信の両方で使用できる ConnectionFactory オブジェクト。新しいアプリケーションでの使用をお勧めします。
送信先には次の 2 種類があります。
ポイントツーポイント通信で使用する Queue オブジェクト
パブリッシュ - サブスクライブ通信で使用する Topic オブジェクト
『Java EE 5 Tutorial』の JMS に関する章では、この 2 つの通信タイプについての詳細および JMS のほかの側面が説明されています (http://java.sun.com/javaee/5/docs/tutorial/doc/index.html を参照)。
リソースを作成する順序は重要ではありません。
J2EE アプリケーションでは、次の手順に従って Application Server の配備記述子に接続ファクトリリソースと送信先リソースを指定します。
接続ファクトリ JNDI 名は resource-ref または mdb-connection-factory 要素に指定します。
送信先リソース JNDI 名は、メッセージ駆動型 Bean の ejb 要素と message-destination 要素に指定します。
物理送信先名は、Enterprise JavaBean 配備記述子の message-driven 要素または message-destination-ref 要素のいずれかにある message-destination-link 要素に指定します。さらに、message-destination 要素にも指定します。message-destination-ref 要素は、新しいアプリケーションで推奨されない resource-env-ref 要素から置き換わります。Application Server 配備記述子の message-destination 要素で、物理送信先名と送信先リソース名をリンクします。
Application Server は、jmsra という名前のシステムリソースアダプタを使用して JMS を実装します。JMS リソースを作成すると、Application Server がコネクタリソースも自動的に作成します。コネクタリソースは、管理コンソールのツリービューに表示される「コネクタ」ノードの下に表示されます。
ユーザーが作成する各 JMS 接続ファクトリに対して、Application Server はコネクタ接続プールとコネクタリソースを作成します。ユーザーが作成する個々の JMS 送信先に対して、Application Server は管理オブジェクトリソースを作成します。ユーザーがJMS リソースを削除するときに、Application Server はコネクタリソースを自動的に削除します。
「JMS リソース」ノードの代わりに管理コンソールの「コネクタ」ノードを使用して、JMS システムリソースアダプタ用のコネクタリソースを作成できます。 詳細については、第 7 章「コネクタリソース」を参照してください。
JMS 接続ファクトリは、アプリケーションがプログラムでほかの JMS オブジェクトを作成できるようにするオブジェクトです。これらの管理対象オブジェクトは、ConnectionFactory、QueueConnectionFactory、および TopicConnectionFactory インタフェースを実装します。Application Server 管理コンソールを使用して、JMS 接続ファクトリを作成、編集、または削除できます。新しい JMS 接続ファクトリの作成では、ファクトリのコネクタ接続プールとコネクタリソースも作成します。
コマンド行ユーティリティーを使用して、JMS 接続ファクトリを管理するには、create-jms-resource、list-jms-resources、または delete-jms-resource コマンドを使用します。
JMS 送信先は、メッセージのリポジトリとして機能します。管理コンソールを使用して、JMS 送信先リソースを作成、変更、または削除できます。新しい JMS 送信先リソースを作成するには、「リソース」>「JMS リソース」>「送信先リソース」の順に選択します。「送信先リソース」ページで、次を指定できます。
リソースの JNDI 名。JMS リソースのネーミングサブコンテキストプレフィックス jms/ を使用することをお勧めします。次に例を示します。jms/Queue
リソースタイプ。javax.jms. Topic または javax.jms.Queue です。
送信先リソースの追加プロパティー。これらのすべての設定と追加のプロパティーの詳細については、管理コンソールのオンラインヘルプを参照してください。
コマンド行ユーティリティーを使用して、JMS 送信先を管理するには、create-jms-resource または delete-jms-resource コマンドを使用します。
asadmin create-jms-resource コマンドの addresslist プロパティーを (host:mqport,host2:mqport,host3:mqport の形式で) 指定するには、\\ を使用して : をエスケープします。たとえば、host1\\:mqport,host2\\:mqport,host3\\:mpqport のようになります。
エスケープ文字の使用の詳細については、asadmin(8) のマニュアルページを参照してください。
本稼動環境では、必ず物理送信先を作成する必要があります。ただし、開発およびテスト段階では、この手順は不要です。アプリケーションが最初に送信先リソースにアクセスすると、Message Queue は、送信先リソースの名前プロパティーで指定した物理送信先を自動的に作成します。物理送信先は一時的なものなので、Message Queue の設定プロパティーで指定した期限が切れると効力を失います。
管理コンソールから物理送信先を作成するには、「設定」>「Java メッセージサービス」>「物理送信先」の順に選択します。「新規」をクリックし、「新しい物理送信先」ページで、物理送信先の名前を指定し、送信先のタイプを topic または queue から選択します。「新しい物理送信先」ページのフィールドとプロパティーの詳細については、管理コンソールのオンラインヘルプを参照してください。
本稼動環境では、必ず物理送信先を作成する必要があります。ただし、開発およびテスト段階では、この手順は不要です。アプリケーションが最初に送信先リソースにアクセスするときに、Message Queue は、送信先リソースの Name プロパティーで指定した物理送信先を自動的に作成します。物理送信先は一時的なものなので、Message Queue の設定プロパティーで指定した期限が切れると効力を失います。
コマンド行ユーティリティーを使用して、JMS 物理送信先を管理するには、create-jmsdest、flush-jmsdest、または delete-jmsdest コマンドを使用します。
管理コンソールの「Java メッセージサービス」ページを使用して、すべての JMS 接続で使用するプロパティーを設定します。管理コンソールで、「設定」 >「Java メッセージサービス」の順に選択します。「Java メッセージサービス」ページで、次の JMS サービスの一般設定を制御できます。
「起動タイムアウト」の間隔を選択します。これは、起動が中止されないように JMS サービスが開始するのを Application Server が 待機する時間を示します。
「JMS サービス」のタイプを選択します。これは、JMS サービスをローカルホストで管理するか、リモートホストで管理するかを指定します。
「起動引数」を指定して、JMS サービスの起動をカスタマイズします。
「再接続」チェックボックスにチェックマークを付けて、接続が失われたときに JMS サービスがメッセージサーバーまたは AddressList で指定したアドレスのリストに再接続を試みるように指定します。
「再接続間隔」を秒数で指定します。これは、AddressList で指定した各アドレスおよびリストの次のアドレスへの試行に適用されます。間隔が短すぎると、ブローカにリカバリする時間が与えられません。間隔が長すぎると、再接続が許容できない遅延を示す場合があります。
再接続の試行回数を指定します。このフィールドに、クライアントランタイムがリストの次のアドレスを試行する前に、AddressList に指定した各アドレスへの接続 (または再接続) を試行する回数を入力します。
デフォルトの JMS ホストを選択します。
「アドレスリストの動作」ドロップダウンリストで、接続の試行を AddressList で指定したアドレスの順序 (priority) で行うか、またはランダムな順序 (random) で行うかを選択します。
「アドレスリストの繰り返し」フィールドで、接続の確立または再確立のために、AddressList を介して JMS サービスが反復する回数を入力します。
デフォルト以外のスキームまたはサービスを使用する場合は、「MQ スキーム」および「MQ サービス」フィールドに、Message Queue アドレススキーム名と Message Queue 接続サービス名を入力します。
これらのすべてのプロパティーの値は実行時にも更新できます。ただし、更新された値を取得するのは、プロパティーの更新後に作成された接続ファクトリのみです。既存の接続ファクトリは元のプロパティー値のままになります。さらに、ほとんどすべての値を有効にするには、アプリケーションサーバーを再起動する必要があります。アプリケーションサーバーを再起動しなくても更新可能なプロパティーは、デフォルトの JMS ホストのみです。
コマンド行ユーティリティーを使用して JMS プロバイダを管理するには、set または jms-ping コマンドを使用します。
プロバイダとホストをリモートシステムに変更すると、すべての JMS アプリケーションがリモートサーバーで実行するようになります。ローカルサーバーと 1 つまたは複数のリモートサーバーを使用するには、リモートサーバーにアクセスする接続を作成する AddressList プロパティーを使用して、接続ファクトリリソースを作成します。
JMS の汎用リソースアダプタは Java EE Connector 1.5 リソースアダプタで、IBM Websphere MQ、Tibco EMS、および Sonic MQ などの外部 JMS プロバイダの JMS クライアントライブラリをラップできるため、任意の JMS プロバイダを Sun Java System Application Server などの Java EE 5 アプリケーションサーバーに統合します。アダプタは Java EE 5 アプリケーションサーバーの管理ツールを使用して配備および設定可能な .rar アーカイブです。
Application Server の管理ツールを使用して、JMS の汎用リソースアダプタを配備および設定できます。ここでは、Sun Java System Application Server を使用して、JMS の汎用リソースアダプタを設定する方法を説明します。
全体として、JMS プロバイダが XA をサポートするかどうかを、リソースアダプタの設定により選択できます。さらに、JMS プロバイダで可能な統合のモードを選択することもできます。リソースアダプタでは、2 つの統合のモードをサポートしています。最初のモードは、統合の手段として JNDI を使用します。この場合、管理対象オブジェクトを JMS プロバイダの JNDI ツリーに設定し、汎用リソースアダプタがそれらを検索し、使用します。このモードが統合に適切でない場合は、JMS 管理対象オブジェクト JavaBean クラスの Java リフレクションを統合のモードとして使用することもできます。
管理コンソールまたはコマンド行を使用して、リソースアダプタを設定できます。これは、他のリソースアダプタの設定と変わりありません。
リソースアダプタを配備する前に、アプリケーションサーバーで JMS クライアントライブラリを使用できるようにします。一部の JMS プロバイダでは、クライアントライブラリにネイティブライブラリも含まれている場合があります。そのような場合は、これらのネイティブライブラリもアプリケーションサーバー JVM から使用できるようにします。
コネクタモジュールを配備する場合と同じように、汎用リソースアダプタを配備します。
コネクタ接続プールを作成します。
コネクタリソースを作成します。
管理対象オブジェクトリソースを作成します。
Application Server のセキュリティーポリシーを次のように変更します。
sjsas_home/domains/domain1/config/server.policy を変更して、java.util.logging.LoggingPermission "control" を追加します。
sjsas_home/lib/appclient/client.policy を変更して、 permission javax.security.auth.PrivateCredentialPermission "javax.resource.spi.security.PasswordCredential ^ \"^\"","read": を追加します。
次の表に、リソースアダプタの作成時に使用するプロパティーを示します。
プロパティー名 |
有効な値 |
デフォルト値 |
説明 |
---|---|---|---|
ProviderIntegrationMode |
javabean/jndi |
javabean |
リソースアダプタと JMS クライアントの統合のモードを指定します。 |
ConnectionFactoryClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.ConnectionFactory |
なし |
JMS クライアントの javax.jms.ConnectionFactory 実装のクラス名。ProviderIntegrationMode が javabean の場合に使用します。 |
QueueConnectionFactoryClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.QueueConnectionFactory |
なし |
JMS クライアントの javax.jms.QueueConnectionFactory 実装のクラス名。ProviderIntegrationMode が javabean の場合に使用します。 |
TopicConnectionFactoryClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.TopicConnectionFactory |
なし |
JMS クライアントの javax.jms.TopicConnectionFactory 実装のクラス名。ProviderIntegrationMode が javabean と指定されている場合に使用します。 |
XAConnectionFactoryClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.XAConnectionFactory |
なし |
JMS クライアントの javax.jms.ConnectionFactory 実装のクラス名。ProviderIntegrationMode が javabean と指定されている場合に使用します。 |
XAQueueConnectionFactoryClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.XAQueueConnectionFactory |
なし |
JMS クライアントの javax.jms.XAQueueConnectionFactory 実装のクラス名。ProviderIntegrationMode が javabean と指定されている場合に使用します。 |
XATopicConnectionFactoryClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.XATopicConnectionFactory |
なし |
JMS クライアントの javax.jms.XATopicConnectionFactory 実装のクラス名。ProviderIntegrationMode が javabean の場合に使用します。 |
TopicClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.Topic |
なし |
JMS クライアントの javax.jms.Topic 実装のクラス名。ProviderIntegrationMode が javabean の場合に使用します。 |
QueueClassName |
アプリケーションサーバークラスパスで使用可能なクラス名。たとえば次のようになります。 com.sun.messaging.Queue |
なし |
JMS クライアントの javax.jms.Queue 実装のクラス名ProviderIntegrationMode が javabean と指定されている場合に使用します。 |
SupportsXA |
True/false |
FALSE |
JMS クライアントが XA をサポートするかどうかを指定します。 |
ConnectionFactoryProperties |
コンマで区切られた名前と値のペア |
なし |
javabean プロパティー名と JMS クライアントの ConnectionFactory の値を指定します。ProviderIntegrationMode が javabean である場合にのみ必要です。 |
JndiProperties |
コンマで区切られた名前と値のペア |
なし |
JMS プロバイダの JNDI への接続に使用する JNDI プロバイダのプロパティーを指定します。ProviderIntegrationMode が jndi である場合にのみ使用します。 |
CommonSetterMethodName |
メソッド名 |
なし |
一部の JMS ベンダーが管理対象オブジェクトにプロパティーを設定するために使用する一般的な setter メソッド名を指定します。ProviderIntegrationMode が javabean である場合にのみ使用します。Sun Java System Message Queue の場合、このプロパティーの名前は setProperty になります。 |
UserName |
JMS ユーザーの名前 |
なし |
JMS プロバイダに接続するためのユーザー名。 |
Password |
JMS ユーザーのパスワード |
なし |
JMS プロバイダに接続するためのパスワード。 |
RMPolicy |
ProviderManaged または OnePerPhysicalConnection |
ProviderManaged |
XAResource の isSameRM メソッドは、トランザクションマネージャーで、2 つの XAResources によって表されたリソースマネージャーインスタンスが同じであるかどうかを判断するために使用されます。RMPolicy を ProviderManaged (デフォルト値) に設定すると、JMS プロバイダが、汎用リソースアダプタの RMPolicy ラッパーおよび XAResource ラッパーが isSameRM 呼び出しをメッセージキュープロバイダの XA リソースの実装に単に委任するかどうかを JMS プロバイダが決定します。これは、大半のメッセージキュー製品で最適に機能するべきです。 IBM MQ シリーズなどの XAResource の一部の実装では、物理接続ごとに 1 つのリソースマネージャーを使用します。これにより、単一のトランザクションで同じキューマネージャーに対するインバウンド通信とアウトバウンド通信がある (たとえば MDB が送信先に応答を送信するなど) 場合に問題が発生します。RMPolicy が OnePerPhysicalConnection に設定されている場合、汎用リソースアダプタの XAResource ラッパーの実装の isSameRM は、ラッパー対象オブジェクトに委任する前に、両方の XAResources が同じ物理接続を使用するかどうかを確認します。 |
ManagedConnectionFactory プロパティーは connector-connection-pool の作成時に指定します。リソースアダプタの作成時に指定されたすべてのプロパティーは、ManagedConnectionFactory でオーバーライドできます。ManagedConnectionFactory でのみ使用可能な追加のプロパティーを次に示します。
プロパティー名 |
有効な値 |
デフォルト値 |
説明 |
---|---|---|---|
ClientId |
有効なクライアント ID |
なし |
JMS 1.1 仕様に指定されている ClientID |
ConnectionFactoryJndiName |
JNDI 名 |
なし |
JMS プロバイダの JNDI ツリーにバインドされた接続ファクトリの JNDI 名。管理者は、JMS プロバイダ自体にすべての接続ファクトリプロパティー (clientID を除く) を指定するようにしてください。このプロパティー名は ProviderIntegrationMode が jndi の場合にのみ使用されます。 |
ConnectionValidationEnabled |
true/false |
FALSE |
true に設定した場合、リソースアダプタは例外リスナーを使用して、接続の例外をキャッチし、CONNECTION_ERROR_OCCURED イベントをアプリケーションサーバーに送信します。 |
このプロパティーは、管理対象オブジェクトリソースの作成時に指定します。リソースアダプタのすべてのプロパティーは、管理対象リソースオブジェクトでオーバーライドできます。管理対象オブジェクトでのみ使用可能な追加のプロパティーを次に示します。
プロパティー名 |
有効な値 |
デフォルト値 |
説明 |
---|---|---|---|
DestinationJndiName |
JNDI 名 |
なし |
JMS プロバイダの JNDI ツリーにバインドされた送信先の JNDI 名。管理者は JMS プロバイダ自体にすべてのプロパティーを指定するようにしてください。このプロパティー名は ProviderIntegrationMode が jndi の場合にのみ使用されます。 |
DestinationProperties |
コンマで区切られた名前と値のペア |
なし |
JMS クライアントの送信先の javabean プロパティー名と値を指定します。ProviderIntegrationMode が javabean である場合にのみ必要です。 |
このプロパティーは、activation-config-properties として MDB の Sun 固有の配備記述子に指定されています。すべてのリソースアダプタのプロパティーは有効化仕様でオーバーライドできます。有効化仕様でのみ使用可能な追加のプロパティーを次に示します。
プロパティー名 |
有効な値 |
デフォルト値 |
説明 |
---|---|---|---|
MaxPoolSize |
整数 |
8 |
同時メッセージ配信用のリソースアダプタによって、内部で作成されるサーバーセッションプールの最大サイズ。これは MDB オブジェクトの最大プールサイズに等しくなるべきです。 |
MaxWaitTime |
整数 |
3 |
リソースアダプタは、その内部プールからサーバーセッションを取得するために、このプロパティーに指定された秒単位の時間を待機します。この制限を超えると、メッセージ配信が失敗します。 |
SubscriptionDurability |
持続性または非持続性 |
非持続性 |
JMS 1.1 仕様に指定されている SubscriptionDurability |
SubscriptionName |
なし |
JMS 1.1 仕様に指定されている SubscriptionName |
|
MessageSelector |
有効なメッセージセレクタ |
なし |
JMS 1.1 仕様に指定されている MessageSelector |
ClientID |
有効なクライアント ID |
なし |
JMS 1.1 仕様に指定されている ClientID |
ConnectionFactoryJndiName |
有効な JNDI 名 |
なし |
JMS プロバイダで作成された接続ファクトリの JNDI 名。この接続ファクトリはリソースアダプタが接続を作成し、メッセージを受け取るために使用します。ProviderIntegrationMode が jndi と設定されている場合にのみ使用します。 |
DestinationJndiName |
有効な JNDI 名 |
なし |
JMS プロバイダで作成された送信先の JNDI 名。この送信先は、リソースアダプタが接続を作成し、メッセージを受け取るために使用します。ProviderIntegrationMode が jndi と設定されている場合にのみ使用します。 |
DestinationType |
javax.jms.Queue または javax.jms.Topic |
NULL |
MDB が待機する送信先のタイプ。 |
DestinationProperties |
コンマで区切られた名前と値のペア |
なし |
JMS クライアントの送信先の javabean プロパティー名と値を指定します。ProviderIntegrationMode が javabean である場合にのみ必要です。 |
RedeliveryAttempts |
整数 |
MDB でメッセージによって実行時例外が発生した場合に、メッセージが配信される回数。 |
|
RedeliveryInterval |
秒単位での時間 |
MDB でメッセージによって実行時例外が発生した場合に、配信を繰り返す間隔。 |
|
SendBadMessagesToDMD |
true/false |
false |
配信の試行回数を超えた場合に、リソースアダプタがデッドメッセージ送信先にメッセージを送信すべきかどうかを示します。 |
DeadMessageDestinationJndiName |
有効な JNDI 名。 |
なし |
JMS プロバイダによって作成された送信先の JNDI 名。これは、デッドメッセージのターゲット送信先です。これは ProviderIntegrationMode が jndi の場合にのみ使用します。 |
DeadMessageDestinationClassName |
送信先オブジェクトのクラス名。 |
なし |
ProviderIntegrationMode が javabean の場合に使用します。 |
DeadMessageDestinationProperties |
コンマで区切られた名前と値のペア |
なし |
JMS クライアントの送信先の javabean プロパティー名と値を指定します。これは ProviderIntegrationMode が javabean の場合のみ必要です。 |
ReconnectAttempts |
整数 |
例外リスナーが接続時のエラーをキャッチした場合に試行される再接続の回数。 |
|
ReconnectInterval |
秒単位での時間 |
再接続の間隔。 |