前へ     目次     索引     DocHome     次へ     
iPlanet Application Server 開発者ガイド



付録 A   Java Message Service の使用法


この付録では、Java Message Service (JMS) API の使用方法を説明します。iPlanet Application Server では、サードパーティの JMS プロバイダによる Java 環境への統合が可能であり、コネクションプーリングとユーザ ID マッピングという 2 つの付加価値機能を備えています。

この付録には次の節があります。



JMS API について

JMS は、エンタープライズメッセージングシステムへの Java 言語インタフェースの標準セットを備える J2EE API で、しばしば「メッセージ指向のミドルウェア」と呼ばれます。このインタフェースは、JMS プロバイダによって実装されます。IBM MQ シリーズでは、iPlanet Application Server は iPlanet Message Queue および JMS プロバイダをサポートしています。iPlanet Message Queue の詳細については、次のマニュアルを参照してください。

http://docs.iplanet.com/docs/manuals/javamq.html

http://java.sun.com/products/jms/index.html の JMS Web ページでは JMS の目的を次のように説明しています。

エンタープライズメッセージングによって、企業内で重要なビジネスデータおよびイベントを非同期で交換するための信頼性の高い、柔軟性のあるサービスが提供されます。これに加えて、JMS API によって共通 API とプロバイダフレームワークが追加されます。このフレームワークによって、Java プログラミング言語で書かれ、移植可能な、メッセージベースのアプリケーションの開発が可能になります。

また、iPlanet Application Server には、JMS コネクションプーリングとユーザ ID マッピングも含まれています。これらは管理フレームワームを通じて提供され、iPlanet Application Server 固有のコードは必要ありません。アプリケーションでは、これらの機能を透過的に使用でき、コンポーネントの移植性を維持できます。


JMS メッセージングスタイル

JMS では、2 つのメッセージングスタイルがサポートされています。

  • Point-to-point:このスタイルを使うと、Queue という名前の Destination を通してメッセージを送受信することによって、2 つのプログラム間で通信できます。

  • Publish/subscribe:このスタイルを使うと、Topic という名前の Destination を通して複数のメッセージングプログラム間で通信できます。メッセージは、Topic をパブリッシュすることによって送信されます。メッセージは、加入者によって受信されます。

メッセージングスタイルにかかわらず、アプリケーションと JMS プロバイダ間のリンクは、コネクションオブジェクトです。アプリケーションは、コネクションオブジェクトをコネクションファクトリから取得します。

JMS プロバイダ間でアプリケーションの移植性を最大に高めるために、プロバイダ固有のメッセージング機能が、管理されたオブジェクトの中にカプセル化されています。JMS 管理オブジェクトによって、次の 4 つの JMS インタフェースを実装できます。そのうちの 2 つは、メッセージングスタイル用です。

  • デスティネーション

    • Queue

    • Topic

  • ConnectionFactory

    • QueueConnectionFactory

    • TopicConnectionFactory

JMS プロバイダによって、これらのインタフェースを実装するサプライクラスが提供されます。配置ツールを使って、管理オブジェクトクラスのインスタンスを作成および設定し、それらを配置の要件に合わせて設定します。管理者は、配置ツールを使って、プロバイダ固有のパラメータを設定します。

このプログラムモデルを使うと、プロバイダから完全に独立した JMS プログラムを記述できます。アプリケーションでは、JNDI を使って、名前で管理オブジェクトを検索します。

次のサンプルでは、コネクションファクトリとデスティネーションを検索し、簡単なテキストメッセージをキューに送ります (わかりやすくするために、例外処理は省略)。

// JNDI を使ってコネクションファクトリとデスティネーションを検索します。 Context ctx = new InitialContext();

QueueConnectionFactory factory;

factory = (QueueConnectionFactory) ctx.lookup ("java:comp/env/jms/theFactory");Queue queue = (Queue) ctx.lookup("java:comp/env/jms/theQueue");

// コネクション、セッション、送信者、およびメッセージを作成します。 QueueConnection conn;
conn = factory.createQueueConnection("myUserName", "myPassword");
QueueSession session = connection.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);
TextMessage msg = session.createTextMessage();
msg.setText("Hello from a simple Java Message Service Application");

// コネクションを確立し、メッセージを送信します。
connection.start();
sender.send(msg);
connection.start();

// すべてのリソースを閉じ、確実にネイティブリソースを解放します。
sender.close();
session.close();
connection.close();

アプリケーションではリソースの名前をハードコードしませんでしたが、アプリケーションの配置に関する節で説明したように、代わりに J2EE リソース参照を使っていることに注目してください。iPlanet Application Server 配置マネージャは JMS リソース参照をサポートしないため、アプリケーションでは、JMS サブコンテキストのオブジェクトを直接参照する必要があります。



JMS の有効化とプロバイダの統合



iPlanet Application Server には、JMS プロバイダを統合するソフトウェアがありますが、そのソフトウェアを有効にする必要があります。iPlanet Application Server に JMS プロバイダを統合する方法については、次のマニュアルを参照してください。

install_dir/ias/ias-samples/jms/docs/index.html



アプリケーションでの JMS の使用法



JMS の iPlanet Application Server に対するサポートは、全面的に標準 J2EE API をベースにしています。付加価値機能を使ったアプリケーションコンポーネントは、ほかの J2EE 環境に移植可能です。この節では、iPlanet Application Server に配置されたアプリケーションで JMS を使うときに考慮する必要があるいくつかの問題について説明します。


JNDI とアプリケーションコンポーネントの配置

JMS オブジェクトは、配置ツールによって、iPlanet Application Server ルートの JNDI ネームスペースの JMS サブコンテキスト内に保存されます。JMS サブコンテキストでは、そのサブコンテキスト自体の作成はサポートされません。コンポーネントアプリケーションコンテキストへのリンクは、アプリケーション配置時に確立されます。

デフォルトのパラメータを持つ InitialContext が作成されると、JMS オブジェクトは、jms/ で始まる名前で参照できます。J2EE リソース参照を使うと柔軟性が高まります。これは、389に示すサンプルで実証されています。ここでは、ファクトリについて検索される名前が java:comp/env/jms/theFactory でした。iPlanet Application Server JMS では、JMS リソース参照がサポートされていません。JMS オブジェクトは、直接参照される必要があります。


コネクションファクトリプロクシ

iPlanet Application Server では、JMS コネクションプーリングとユーザ ID マッピングがサポートされます。ConnectionFactoryProxy クラスは、アプリケーションと JMS プロバイダのコネクションファクトリ間で機能します。2 つのプロクシクラスがあり、メッセージングスタイルごとに 1 つあります。

  • QueueConnectionFactoryProxy

  • TopicConnectionFactoryProxy

プロクシクラスによって表された API は標準 JMS API で、QueueConnectionFactoryTopicConnectionFactory です。管理者だけがプロクシを管理する必要があり、プロクシはアプリケーションに対して透過的に使われます。

簡単な管理プログラムを使って ConnectionFactoryProxies の設定を行います。プロクシは、コネクションプーリングとユーザ ID マッピングを処理します。JMS オペレーションは、管理者によって指定されたプロバイダファクトリから、プロクシによって取得されたコネクションに転送されます。


コネクションプーリング

JMS コネクションのセットアップはネットワーク集約型で、そのため費用がかかります。コネクションプーリングを使うと、JMS コネクションの再利用が容易になります。プーリングが有効のままアプリケーションがコネクションを閉じると、プロクシはプロバイダコネクションを閉じるのではなく、そのコネクションをプールに返します。後続のアプリケーションで、同じユーザ名とパスワードを使ってコネクションを作成しようとすると、プロクシはそのコネクションを再利用します。


ユーザ ID マッピング

また、ConnectionFactoryProxyには、ユーザ ID マッピング機能が用意されています。JMS プロバイダは、アプリケーションサーバと同じセキュリティインフラストラクチャを使わず、別のユーザネームスペースを持っています。ユーザ ID マッピングによって、管理者は柔軟にセキュリティインフラストラクチャを設計できます。

コネクションファクトリプロクシクラスによって 2 つのマッピング形式が用意されています。

  • デフォルトユーザ名

  • 明示的なユーザ ID マッピング

コネクションプーリングと同様に、この機能は標準 JMS API 内のプロクシクラスによって実装されます。このユーザ ID マッピングを使うと、メッセージングシステムへのアクセスを管理する iPlanet Application Server ユーザセキュリティメカニズムによって配置が決まります。


デフォルトユーザ名について

デフォルトユーザ名とパスワードを使うと、複数のアプリケーションユーザが、1 つのメッセージンシステムプロバイダのユーザ ID とパスワードを共有できます。

プロクシの作成時に、管理者はデフォルトのプロクシユーザ名とパスワードを定義します。引数なしのコネクションクリエートメソッドを起動するアプリケーションでは、コネクション作成時にプロバイダファクトリにこれらの値を渡します。たとえば、アプリケーションが次の呼び出しを行う場合、

connection = proxy.createQueueConnection();

デフォルトユーザ名が設定されていると、iPlanet Application Server のプロクシ実装によって、次の JMS コネクションを取得します。

connection = providerFactory.createQueueConnection (defaultUserName, defaultPassword);


明示的なユーザ ID マッピングについて

明示的なユーザ ID マッピングも使用できます。マップには、エントリリストがあります。各エントリは、固有のユーザ ID キーによって参照され、各エントリには次の 2 つの値があります。

  • jmsUserName

  • jmsPassWord

管理者は、jmsuadm ツールを使ってマップを作成します。エントリの値はコネクション作成時に使われます。たとえば、アプリケーションでは、プロクシを使って、次のようにコネクションを作成します。

connection = proxy.createQueueConnection(userString, passWordString);

iPlanet Application Server プロクシでは、マップ内の userString のエントリを検索します。エントリが見つかると、プロクシは、アプリケーションから提供されたパスワードを無視し、エントリからの jmsUserNamejmsPassWord 値を JMS プロバイダファクトリに渡します。これにより、プロクシは次のコネクションを実行します。

connection = providerFactory.createConnection (entry.jmsUserName, entry.jmsPassWord);

userString に一致するエントリがユーザ ID マップ内で見つからない場合は、アプリケーションによって与えられた値が JMS プロバイダファクトリ (providerFactory) に渡されます。


ConnectionFactoryProxies とアプリケーションクリエートスレッド

Servlet では Java スレッドを作成できますが、この方法は、お勧めしません。JMS コネクションプーリングインフラストラクチャでは、ユーザクリエートスレッドが認識されません。アプリケーションでは、ユーザクリエートスレッドから、コネクションクリエートまたはコネクションクローズメソッドを呼び出すことができません。これらのメソッドを呼び出そうとすると、次のような結果になります。

javax.jms.IllegalStateException

これは、JMS ベータ版では実装されていません。ベータ版では、アプリケーションクリエートスレッドから、コネクションクリエートまたはコネクションクローズを実行しようとすると、KJS がクラッシュします。


サポートされていない JMS 機能

iPlanet Application Server は、JMS 仕様書に記載されている JMS XAConnection およびサーバセッションプール機能はサポートしていません。



JMS 管理



JMS API は、移植性が管理されているオブジェクトに依存します。プロバイダ固有の配置は、管理されているオブジェクトにカプセル化され、アプリケーションコードが移植可能になります。iPlanet Application Server の環境では、JMS 管理は 4 つのタスクから構成されています。

  • JMS プロバイダファクトリおよびデスティネーションの作成

  • ユーザ ID マッピングの作成

  • ConnectionFactoryProxies の作成

  • iPlanet Application Server レジストリコネクションプーリングパラメータの変更


JMS オブジェクト配置ツール

各 JMS 製品には管理プログラムが必要です。このツールによって、オブジェクトを作成し、それを iPlanet Application Server JNDI の名前にバインドします。この節では、JMS JNDI コンテキストで動作するようにツールを設定するために必要な Java プロパティとシステムパスについて説明します。特定のツールの設定方法については、プロバイダのマニュアルを参照してください(iPlanet Application Server 用の IBM MQ JMS の配置ツールを起動するスクリプトについては次の節で説明します)。

表 A-1 は、InitialContext 作成時に JMS コンテキストにアクセスするために使うプロパティ値を示しています。


表 A-1    Java プロパティの名前と値  

Java プロパティの名前

プロパティ値

Java.naming.factory.initial  

com.netscape.server.jndi.ExternalContextFactory  

Java.naming.provider.url  

/jms  


JMS 配置ツール用の JNDI プロパティ

JMSContext にアクセスするために必要な Java クラスの場合は、Java の実行時 classpath に次の 3 つの .jar ファイルを加えます。

  • GX_ROOTDIR/classes/java/jms.jar

  • GX_ROOTDIR/classes/java/javax.jar

  • GX_ROOTDIR/classes/java/kfcjdk11.jar

ここで、GX_ROOTDIR は iPlanet Application Server がインストールされた場所です。次に例を示します。

/usr/iPlanet/ias6/ias

Solaris では、LD_LIBRARY_PATH に次のディレクトリが含まれている必要があります。

$GX_ROOTDIR/gxlib


IBM MQ の JMS オブジェクト管理

iPlanet Application Server には IBM MQ JMS 管理プログラムを起動する mqjmsadm スクリプトが組み込まれています。このスクリプトは、GX_ROOTDIR/jms/bin 内にあります。この管理プログラムは Java クラスです。mqjmsadm は、管理者または入力ファイルからの入力を受け入れる対話型コマンドラインプログラムです。

操作は、JMS 管理のための MQSeries のマニュアルに説明があります。mqjmsadm は自動的に JNDI 設定を処理するので、-cfg オプションを使う必要はありません。たとえば、コネクションファクトリとキューは、次の mqjmsadm セッションで作成できます。

# mqjmsadm

そのレスポンスは次のとおりです。

5648-C60 (c) Copyright IBM Corp. 1999. All Rights Reserved.

Starting MQSeries Classes for Java(tm) Message Service Administration

Connected to LDAP server on localhost port 389InitCtx define q(theQueue) queue(SYSTEM.DEFAULT.LOCAL.QUEUE)
InitCtx> define qcf(theFactory)
InitCtx display> ctx

Contents of InitCtx
a aQueue            com.ibm.mq.jms.MQQueue
a theProviderFactorycom.ibm.mq.jms.MQQueueConnectionFactory
2 Object(s)
0 Context(s)
2 Binding(s), 2 Administered
InitCtx> end

JMS コンテキストではサブコンテキストがサポートされていません。そのため、JMSAdmin コマンドを使ってサブコンテキストを操作すると、エラーメッセージが生成されます。


コネクションファクトリプロクシ管理

コネクションファクトリプロクシは、jmspadm コマンド (JMS プロクシ管理者) によって作成されます。このコマンド (UNIX 用のシェルスクリプトまたは NT 用の BAT ファイル) は、与えられたパラメータによってコネクションファクトリプロクシを作成し、それを JNDI にバインドする java プログラムを起動します。プロクシパラメータは、コマンドライン引数によって設定されます。

コマンドによって、プロクシ上で 3 つの操作が行われます。

  • プロクシの作成

  • プロクシの削除

  • プロクシパラメータの一覧表示


プロクシの作成

プロクシを作成するには、次のコマンドを入力します。

jmspadm proxyName factoryName <-p or +p> <-u user password> <-m userMapNam>

最初の 2 つの引数は必須です。

  • 新しいプロクシに与えられる JNDI 名

  • プロクシの対象になるコネクションファクトリの JNDI 名

JMS オブジェクトは、JMS サブコンテキストにしかないので、提供された名前が jms で始まっていない場合は、その文字列が先頭に付きます。たとえば、次の 2 つのコマンドは、同じ結果になります。

  • jmspadm theFactory theProviderFactory

  • jmspadm jms/theFactory jms/theProviderFactory

プロバイダ固有のツールを使って、jmspadm を実行する前にファクトリを作成し、ファクトリクラスを使用可能にします。残りの引数はオプションです。これらは、実行時にプロクシの操作を制御するときに使います。デフォルト設定は次のとおりです。

  • コネクションプーリングは有効。-p. を使ってコネクションプーリングを無効にする

  • デフォルトの useridpassword はなし。-u. を使って設定する

  • ID マッピングはなし。ユーザ ID マッピングの JNDI 名がプロクシによって使われるように設定する方法については次の節で説明する


プロクシの削除

プロクシを削除するシンタックスは次のとおりです。

jmspadm -d proxyName


プロクシパラメータの一覧表示

JNDI に保存されたすべてのプロクシを一覧表示するには、コマンドjmspadm -l を使います。


ユーザ ID マッピング管理

ユーザ ID マッピングを作成するには、管理者は、XML ファイルを用意する必要があります。このファイルが準備できたら、jmsuadm コマンドを使います。このコマンドには、3 つの種類があります。

  • jmsuadm mapName mapFileName は、指定されたファイルを読み取り、ユーザ ID マッピングを作成する

  • jmsuadm -d mapName はマップを削除する

  • jmsuadm -l はマップ名を一覧表示する

セキュリティ保護のため、マップの内容は一覧表示できません。管理者は、注意して入力ファイルを保護する必要があります。

入力ファイルのフォーマットは XML です。DTD のパブリック名は次のとおりです。

-//Sun Microsystems, Inc.//DTD iAS JMS User Identity Map 1.0//EN

次の入力ファイルには、2 人の JMS ユーザのマッピング例を示します。

<?xml version="1.0" encoding="iso8859-1"?>

<!DOCTYPE jms-user-id-map PUBLIC "-//Sun Microsystems, Inc.//DTD iAS JMS User Identity Map 1.0//EN" "TODO:fill this in">

<jms-user-id-map>
   <user>
       <name>bob</name>
       <jms-name>jmsuser</jms-name>
       <jms-password>secret</jms-password>
   </user>

   <user>
       <name>nancy</name>
       <jms-name>jmsuser2</jms-name>
       <jms-password>private</jms-password>
   </user>
</jms-user-id-map>

各ユーザ要素は、上記の例の次の 3 つの要素をすべて含んでいる必要があります。

  • name

  • jms-name

  • jms-password

次のように、空の値も使用できます。

<jms-name></jms-name>


コネクションプーリングの設定

JMS コネクションプールの一部のパラメータは iPlanet Application Server レジストリに保存されます。必要があれば、iPlanet Application Server の bin ディレクトリ内の kregedit プログラムを使ってパラメータを調整できます。

パラメータは、登録されたデータソースごとに次のレジストリパス内に格納されます。

SOFTWARE¥iPlanet¥ApplicationServer¥6.5¥CCS0¥Datasource¥

コネクションプールのパラメータについては、『iPlanet Application Server 管理者ガイド』の第 8 章「データベース接続の管理」を参照してください。



サンプルアプリケーション



JMS サンプルアプリケーションは次のディレクトリにあります。

install_dir/ias/ias-samples/jms



デフォルトの JMS プロバイダ



iPlanet Message Queue (iMQ) for Java 2.0 SP1 は、iPlanet Application Server のデフォルトのメッセージングミドルウェアです。iMQ for Java 2.0 SP1 は、iPlanet Application Server プロダクト CD に収録されています。


前へ     目次     索引     DocHome     次へ     
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.

最新更新日 2002 年 3 月 6 日