このセクションでは、 SOAtest およびVirtualize のサポート ツールおよびセットアップ アクション ツールで JMS トランスポートを使用する方法を説明します。
セクションの内容:
JMS の前提条件
SOAtest を JMS クライアントとして使用している場合は、JMS ミドルウェアとの接続確立に SOAtest で JNDI プロバイダーを使用することを推奨します。このようにするには、JNDI プロバイダーをセットアップする必要や、すべての必要な Jar ファイル (例:初期コンテキストを含むもの) がクラスパスに追加されている必要があります (Jar ファイルをクラスパスに追加する方法についての詳細は、「システムプロパティの設定」を参照してください)。また、ConnectionFactory、 Destination、および JNDI プロバイダーがルックアップする Reply-to キューの名前も指定する必要があります。
JMS のセットアップに SOAtest が ConnectionFactory のインスタンスを照会することができる JNDI を持たない場合は、「JNDI を使用しない JMS メッセージング」の手順に従ってください。あるいは、単純なファイル システム JNDI プロバイダーを設定することもできます。 そのようなプロバイダーの Jars やマニュアルは Oracle Java サイトから入手できます。ファイル システムプロバイダーのセットアップは非常に簡単であり、マニュアルはダウンロードに含まれています。 プロバイダーの準備ができたら、「一般的な JMS プロバイダーの構成」で説明されているように、引数にホストとポートを使用して JMS サーバーに接続する ConnectionFactory のインスタンスを作成する単純な Java コードの一部分を使用します。Virtualize で使用されるトピックとキューについても同様に対処します。
JMS オプションの構成
適切なツールの [トランスポート] タブ内の [トランスポート] ドロップダウンメニューから [JMS] を選択すると、以下のオプションが [トランスポート] タブの左ペインに表示されます。
接続設定
[接続設定] は、 [JNDI 初期コンテキスト] の [設定] および [プロパティ] タブを含みます。
[プロパティ] タブは任意オプションであり、[設定] タブで指定される プロバイダー URL および 初期コンテキスト プロパティの他に、JNDI の javax.naming.InitalContext コンストラクターに渡される付加的なプロパティを指定できます。[追加] をクリックし、 [JMS プロパティの追加] ダイアログを完了することによって追加できるプロパティの値は、固定値、パラメータライズ値、スクリプトを使用した値、または固有値 (2 つのツールの呼び出しが同じ値を使用しないような、自動的に生成されるランダムな一意の値) に設定することができます。
[設定] タブには次の内容が含まれます。
- JMS 接続用の共有プロパティを作成した場合、ドロップダウン メニューが使用可能になり、[ローカルの設定を使用] または [共有プロパティを使用] を選択できます。
- [共有プロパティを使用] を選択すると、もう 1 つのドロップダウン メニューが表示され、ツールが使用するグローバル JMS 設定を選択できます。グローバルな JMS 設定の詳細については 「グローバル設定の追加」を参照してください。
- [ローカルの設定を使用] を選択するか、共有プロパティが設定されていない場合は、接続設定の他のオプションを構成できます。
- プロバイダー URL: JNDI javax.naming.InitialContext コンストラクターに渡される javax.naming.Context.PROVIDER_URL プロパティの値を指定します。
- 初期コンテキスト: javax.naming.Context.INITIAL_CONTEXT_FACTORY プロパティの文字列の値として JNDI javax.naming.InitialContext コンストラクターに渡される完全修飾クラス名の文字列を指定します。
- 接続ファクトリ: ファクトリの JNDI 名を指定します。これは、javax.jms.QueueConnectionFactory または javax.jms.TopicConnectionFactory インスタンスを生成するために javax.naming.InitialContext の lookup() メソッドに渡されます。
[接続設定] には、以下のその他のオプションがあります。
- キュー接続またはトピック接続の認証: キュー接続を作成するためのユーザー名およびパスワードを指定できます。リクエストを認証するには、[認証の実行] チェックボックスをオンにし、[ユーザー名] および [パスワード] を入力します。正しいユーザー名およびパスワードが指定されていない場合、リクエストは認証されません。ここで指定したユーザー名とパスワードは、javax.jms.QueueConnectionFactory クラスの createQueueConnection() メソッドに渡され、javax.jms.QueueConnection のインスタンスの取得に使用されます。
- キープアライブ接続 : テストが現在の接続を共有するかクローズするかを指定します。共有接続は接続プールに返され、他のテスト スイートで使用されます。接続プールのライフ サイクルは次のとおりです。
- 単一のテストの場合、テスト実行後に接続プールが破棄されます。
- テスト スイートの場合、テスト スイート実行の最後で接続プールが破棄されます。
- 負荷テストの場合、負荷テストの最後で接続プールが破棄されます。
キュー/トピック
[キュー/トピック オプション] には以下のオプションがあります。
- JMS Destination: メッセージを送信するキュー名 (ポイント ツー ポイントを使用する場合) まはたトピック名 (パブリッシュ/サブスクライブを使用する場合) を指定します。
- JMS ReplyTo: レスポンス メッセージを取得するキュー名 (ポイント ツー ポイントを使用する場合) まはたトピック名 (パブリッシュ/サブスクライブを使用する場合) を指定します。[差出人] ではなく [一時的] を選択すると、一時キューを使用できます。
メッセージング モデル
メッセージング モデル オプションは、アプリケーション間でどのようにメッセージが送信されるかを指定します。[ポイント ツー ポイント] または [パブリッシュ/サブスクライブ] を選択します。
メッセージの期限
メッセージ期限オプションは、メッセージの有効期限を (ミリ秒で) 指定します。
メッセージ交換パターン
メッセージ交換パターン オプションは、SOAtest がレスポンスを受信するかどうかを指定します。[レスポンスの取得] をオンにすると、SOAtest はメッセージを送信してレスポンスを受信します。[レスポンスの取得] をオフにすると、SOAtest は一方向のメッセージを送信し、レスポンスを受信しません。
また、[レスポンスの取得] が選択されている場合には、 [メッセージ送信前に JMS の返信先にメッセージ コンシューマーを作成] を有効化することもできます。JMS の返信先トピックに非常に短時間でレスポンスが到着することが予想される場合、このオプションをオンにして、レスポンス メッセージがパブリッシュされる前に必ず SOAtest が返信先トピックをサブスクライブしているようにします。
このオプションと [レスポンスの JMSCorrelationID とリクエストの JMSMessageID を照合] は同時に選択できません。なぜなら、 JSM の仕様はメッセージ送信後に JMSMessageID を生成するようベンダーに要求しているからです。そのため、メッセージが送信され JMSMessageID が利用可能になる前に、応答条件 (セレクター) を指定してレスポンスの返信先にコンシューマーを作成することはできません。
メッセージ タイプ
ドロップダウン メニューからメッセージ タイプを選択できます。JMS メッセージは、JMS クライアント間で転送されるデータを含む Java オブジェクトです。次のメッセージ タイプを選択できます。
- TextMessage: java.lang.String を含むメッセージの送信に使用されます。単にシンプルなテキスト ドキュメントを送信したい場合に役立ちます。SOAP over JMS の場合は、TextMessage に入力した文字列は SOAP エンベロープである必要があります。
- BytesMessage: 未解釈バイトのストリームを含むメッセージの送信に使用します。メッセージの受信者はそのバイトが適切であるとして解釈します。SOAP over JMS の場合は、ByteMessage に入力したバイトは SOAP エンベロープを構成するべきです。データは、最も基本的な表現で送信されます。また、JMS ノードが転送データ/ルーティング データのみに興味があり、データのコンテンツが重要ではないときに役立ちます。BytesMessage は TextMessage と並んで最も一般的に使用されます。
- Parasoft 設定のエンコーディングが UTF-8 (デフォルト) のとき、SOAtest がレスポンスの BytesMessage から文字列を抽出する方法を制御するために [メソッド] オプションを使用できます。ドロップダウン リストの 2 つのメソッドは BytesMessage JMS API で利用可能な 2 つのメソッドに対応します (詳細については Oracle Java ドキュメントを参照してください)。
- 異なるエンコーディングが設定で選択されている場合、 SOAtest は異なる文字エンコーディングを考慮するためにレスポンス メッセージ上で常に BytesMessage.readBytes() を呼び出します。
- StreamMessage: プリミティブ値のストリームの送信に使用します。SOAP over JMS の場合、 StreamMessage に入力したストリームは SOAP エンベロープであるべきです。
- ObjectMessage: Java Serializable の送信に使用します。Java Serializable を返すにはスクリプティング入力ビューを使用するべきです。SOAtest はこのオブジェクトを取得し、実行中に ObjectMessage に挿入します。
- MapMessage: 名前 - 値の組み合わせの送信に使用します。この値は、 Java プリミティブか個々のラッパー、文字列、またはバイト配列のみです。MapMessage オブジェクトの複雑さのひとつは、ユーザーが文字列 (setString() を使用) として値を挿入しても、値が数値に強制できる場合は getInt() を呼び出して integer 型の値を取得することです。
リクエスト メッセージ プロパティ
リクエスト メッセージ プロパティは任意プロパティです。メッセージをキューに送信 (またはトピックにパブリッシュ) する前に javax.jms.Message オブジェクトにさまざまなプロパティ値を設定できます。これらは、対応する javax.jms.Message の "set" メソッドの 1 つ、またはカスタム プロパティ (たとえば、 setStringProperty、setBooleanProperty、 setByteProperty などで設定されたプロパティ) を含みます。
[追加] をクリックし、 [JMS プロパティの追加] ダイアログを完了することによって追加できるプロパティの値は、固定値、パラメータライズ値、スクリプトを使用した値、または固有値 (2 つのツールの呼び出しが同じ値を使用しないような、自動的に生成されるランダムな一意の値) に設定することができます。追加する値それぞれに必ずタイプを指定してください。
レスポンス メッセージ応答条件
[レスポンス メッセージ応答条件] には以下のオプションがあります。
- レスポンスの JMSCorrelationID とリクエストの JMSMessageID を照合: このオプションをオンにすると、セレクター式に JMSCorrelationID = '[msgId]' という条件が追加されます。msgId は発信 (リクエスト) avax.jms.Message が getJMSMessageID() を使用して動的に生成する値です。つまり、指定された相関 ID を持つメッセージがキュー (またはトピック) で利用可能になるまで、ツールはブロックされます。また、ツールはキュー (またはトピック) の任意のメッセージではなく、指定された特定のメッセージだけを取得します。タイムアウト期間が経過してもセレクター条件によって期待されるメッセージがない場合、ツールはタイムアウトします。
- レスポンスの JMSCorrelationID とリクエストの JMSCorrelationID を照合 : このオプションをオンにすると、セレクター式に JMSCorrelationID = '[correlationId]' という条件が追加されます。correlationId は [リクエスト メッセージ プロパティ] セクションの JMSCorrelationID プロパティから取得されます。このオプションは、[リクエスト メッセージ プロパティ] セクションに JMSCorrelationID プロパティが追加されている場合にだけ利用可能です。つまり、指定された相関 ID を持つメッセージがキュー (またはトピック) で利用可能になるまで、ツールはブロックされます。また、ツールはキュー (またはトピック) の任意のメッセージではなく、指定された特定のメッセージだけを取得します。タイムアウト期間が経過してもセレクター条件によって期待されるメッセージがない場合、ツールはタイムアウトします。
- その他のセレクター式の条件: (任意) メッセージ フィルターとして機能する値を入力します。たとえば、
username==John
と入力することで、ユーザー名として "John" を含むメッセージのみが配信されます。このフィールドが空の場合、どんなメッセージでもキューから受信できます。
この式はポイントツー ポイントの javax.jms.QueueSession クラスの createReceiver() メソッドに渡されるか、パブリッシュ/サブスクライブメッセージの javax.jms.TopicSession クラスの createSubscriber() メソッドに渡されます。セレクターの指定に関するヒントは、「メッセージ セレクター フィルターの使用」を参照してください。
JMS を使用するクライアントのためのメッセージ オブジェクト出力
JMS トランスポートを使用する Messaging Client にメッセージ オブジェクト出力を追加できます。また、JMS トランスポートを使用する Call Back ツールに受信 JMS メッセージ オブジェクト出力を追加することもできます。たとえば、JMS を使用する Messaging Client に連結された Extension ツールは、レスポンスの JMS メッセージにアクセスできます。ObjectMessage では、getter
および equals()
メソッドを使用してレスポンスを検証し、回帰コントロールを作成できます。また、レスポンス トラフィックに Diff ツールを連結し、レスポンスが ObjectMessage である場合、SOAtest は挿入されたシリアライザブル オブジェクトを XML 形式に変換し、XML の比較を実行します。その際、データ バンクの値を使用したり、XPath の差異を無視したりできます。
メッセージ オブジェクト出力を追加するには、次の操作を行います。
- 出力を追加する Messaging Client または Call Back ツールのノードを右クリックし、ショートカット メニューの [出力の追加] をクリックします。[出力の追加] ウィザードが表示されます。
- [出力の追加] ウィザードの左側のペインで [レスポンス] > [ メッセージオブジェクト] (Call Back ツールの場合は [受信リクエスト] > [受信 JMS メッセージ]) を選択します。
- 右側のペインで [新規出力] または [既存の出力] および目的のツール (Extension ツールなど) を選択します。
- [終了] ボタンをクリックします。選択されたノードに新規出力が追加されます。
一般的な JMS プロバイダーの構成
詳細については、次を参照してください。 JMS プロバイダーの設定
一時的な JMSReplyTo キューへの応答
JMS メッセージに対して、JMSReplyTo フィールドに設定した一時キューを使用して応答するには、次の操作を行います。
- Call Back ツールを作成し、JMS メッセージを受信するよう設定します。
- Call Back ツールを右クリックし、[出力の追加] > [受信 JMS メッセージ] > [Extension ツール] をクリックします。
- 受信メッセージ (入力オブジェクト) をあらかじめ決められたキーでスクリプト コンテキストに格納するカスタム スクリプトを作成します。
このキーは、SOAtest Extensibility API の SOAPUtil.JMS_MSG_KEY で定義されます。SOAtest Extensibility API を参照するには、[Parasoft] メニューの [ヘルプ] をクリックし、『Parasoft SOAtest Extensibility API』というタイトルのブックを探します。
- 次のコードは、Jython のサンプルです。
from soaptest.api import *
def getJMSReplyTo(input, context):
context.put(SOAPUtil.JMS_MSG_KEY, input)
- JMS レスポンス メッセージを送信するツールを作成し、構成します。
- ツールの JMSDestination として、SOAtest Extensibility API の別のキーワードである SOAPUtil.JMS_CONTEXT_QUEUE を使用します。
SOAtest は、宛先として入力されたキーワードの代わりに、受信メッセージの一時キューを宛先として使用します。
メッセージセレクター フィルターの使用
さまざまなツールで、メッセージ フィルターとして振る舞う値を指定できます。[メッセージ セレクター] または [その他のセレクター式条件] というラベルのフィールドで指定します。
たとえば、username==John
と入力することで、ユーザー名として "John" を含むメッセージのみが配信されます。このフィールドが空の場合、どんなメッセージでもキューから受信できます。
以下はメッセージ セレクター フィルターを操作するためのヒントです。
[その他のセレクター式の条件] の値を変数、環境変数、およびデータ ソース値に対してパラメータライズできます。変数および環境変数を参照する構文は、 ${myVariableName} です。XML Data Bank の値と XML Data Source の値を参照する構文は ${myColumnName} です。${myColumnName}.たとえば、 JMSCorrelationID = '${myColumnName} を使用できます。
- コンテンツに基づいてイベント メッセージをフィルターしたい場合、XML Transformer のようなツールを自身の XML のイベント出力として連結できます。
- セレクター フィールドは "message selectors" と呼ばれる JMS 機能にリンクします。SOAtest は指定した式を javax.jms.MessageConsumer を作成するときに javax.jms.Session オブジェクトに渡します。JMS 仕様によって定義されたように、セレクター式は JMS メッセージ ヘッダーおよびプロパティに適用できます。メッセージ ボディのコンテンツには適用できません。
- ポイントツー ポイント メッセージングでは、この式は javax.jms.QueueSession クラスの createReceiver() メソッドに渡されます。パブリッシュ/サブスクライブ メッセージングでは、javax.jms.TopicSession クラスの createSubscriber() メソッドに渡されます。
式構文は SQL92 のサブセットです。たとえば、
fruit = 'apple'
またはJMSCorrelationID = '123456
' という式は、 SOAtest がプロパティfruit
が値apple
で定義された JMS メッセージ、または JMSCorrelationID が値123456
に設定された JMS ヘッダーだけをピックアップすることになります。- JMS 機能についての詳細な情報は、 Oracle Java サイトの Java Message Service 仕様を参照してください。
JNDI を伴わない JMS メッセージング
JMS 接続ファクトリおよび宛先インスタンスを取得するために JNDI を使用することは、構造上の側面から非常に推奨されています。なぜなら、JMS コンシューマー コードをベンダー固有の依存性から分離するからです。テスト環境またはステージング環境では、 JMS システムは JNDI が構成されていない、または JNDI が任意の接続ファクトリに含まれていない場合があります。さらに、 JNDI の有無で課題をデバッグするまたはシステム パフォーマンスの特性を分離するために、テスト中に JNDI をバイパスするのに役立つ可能性があります。
これらの理由で、 SOAtest または Virtualize の JMS 対応ツールは、 JNDI を通過することなく、JMS プロバイダーが許可する限りベンダーの接続ファクトリ ディレクトリを使用する JMS メッセージの送受信を可能にします。
この機能は、JMS 接続がそもそも JNDI を使用することなく確立されることを可能にするよう設計され、単一の文字列引数を接続 URL として受け取るコンストラクターとともに接続ファクトリ クラスを提供する特定の JMS 実装をサポートします。
サポートされている JMS の実装
JNDI を使用しない JMS メッセージのサポートは、標準の JMS API に基づいていないため異なる JMS 実装間での移植性は保証されません。
この機能は Sonic と TIBCO JMS ではテストされています。WebSphere MQ でも、「IBM WebSphere MQ (MQ Series)」に記載の構成でサポートされています。
現時点では、Oracle/BEA WebLogic、 JBoss、または WebSphere Default JMS プロバイダー用に接続ファクトリを直接作成することは SOAtest ではサポートされていません。ほとんどの場合は、これらのベンダーによってドキュメント化または推奨されていません。
設定
SOAtest で JMS メッセージ ツールの 1 つが JNDI を使用せずにメッセージを送受信するように構成するには、次の操作を行います。
- JNDI 接続設定の [プロバイダー URL] フィールドで接続 URL を維持します。
- [初期コンテキスト] フィールドは空にします。
- [接続ファクトリ] フィールドに MOM 接続ファクトリ クラス名の絶対パスを指定します。クラス名は javax.jms.ConnectionFactory を実装するクラスを表すべきです。
- Sonic および TIBCO の場合は、JNDI プロバイダー URL と同じパターンに従うことができます ( 詳細については、「Progress Sonic MQ/ESB」および「TIBCO EMS」を参照してください)。
空の [初期コンテキスト] フィールドは、接続ファクトリ オブジェクトを JNDI を使用せずに直接インスタンス化するシグナルとして解釈されます。文字列引数を 1 つ取り、 [プロバイダー URL] フィールドで指定した接続 URL に渡すコンストラクターで実施を試みます。接続の認証設定はまだ通常どおりに使用されます。プロバイダーの接続ファクトリ API にそのようなコンストラクターが存在しない場合、接続ファクトリ クラスをインスタンス化するために JNDI が必要です。
たとえば、 Sonic JMS の場合、提供される接続ファクトリクラス名は progress.message.jclient.ConnectionFactory
となります。TIBCO JMS では、com.tibco.tibjms.TibjmsConnectionFactory
となります。一方、 JBoss および OpenJMS は接続 URL 引数を 1 つ取る接続ファクトリを持ちません。これらの場合は、 SOAtest または Virtualize を使用してこれらのシステムで JMS メッセージを交換するために JNDI がある必要があります。
JNDI 設定の構成に関わらず、 JNDI が存在し、名前がディレクトリに存在する場合は SOAtest および Virtualize は常に JNDI から宛先 (キューまたはトピック) 名の解決を試みます。JNDI を介して見つけられない場合は、 JMS セッション インスタンスから宛先ディレクトリの作成を試みます。ユーザーが提供する名前は物理的な宛先名であり JNDI 名ではないと想定します。
注意: Sun の JNDI 実装も利用可能です。詳細については、「Sun JMS」を参照してください。
キューのコンテンツをブラウズ
[キュー ブラウザー] ビューでは、Websphere MQ、 Websphere Application Server、 Tibco EMS、 Sonic MQ、 ActiveMQ、 およびその他の JMS プロバイダー上にデプロイされたキューの内容を参照できます。詳細については、 キューのブラウズ「キューのブラウズ」「SOAtest でのキューのブラウズ」および「 Virtualize でのキューのブラウズ」 を参照してください。