ユーザーズ ガイド

     前  次    目次     
ここから内容

Oracle Service Bus でのメッセージ フローの作成

Oracle Service Bus におけるメッセージ フローは、プロキシ サービスの実装を定義します。Oracle Service Bus プロキシ サービスは、Oracle Service Bus Console または Workshop for WebLogic 用の Oracle Service Bus プラグインで作成およびコンフィグレーションできます。この節では、メッセージ フローについて説明し、メッセージ フローを設計する際のガイドラインを示します。

以下の節では、Oracle Service Bus のメッセージ フローについて説明します。

Oracle Service Bus Console でメッセージ フローを作成およびコンフィグレーションする手順については、以下を参照してください。

Workshop for WebLogic でメッセージ フローを作成およびコンフィグレーションする手順については、以下を参照してください。

 


メッセージ フローのコンポーネント

メッセージ フローは、プロキシ サービスを介してメッセージが流れるときのメッセージのルーティングと操作のロジックを定義するコンポーネントで構成されます。各ノードは、メッセージ フローでメッセージをルーティングするようにコンフィグレーションされます。また、ステージとアクションには、メッセージの処理とトランスフォーメーションに関するルールが含まれます。

メッセージ フローのほとんどの処理ロジックは、パイプラインで処理されます。パイプラインとは、分岐のない一方向の処理の流れを表す名前付きのステージ シーケンスです。パイプラインは、以下のカテゴリに分類されます。

プロキシ サービスの処理ロジックを実装するには、要求パイプラインと応答パイプラインをペアにしてパイプライン ペア ノードを作成します。これらのパイプライン ペア ノードを他のノードと結合して単一ルートのツリー構造を作成することで、フロー全体を制御できます。

メッセージ フローを定義する際に使用できるコンポーネントを表 3-1 に示します。

表 3-1 メッセージ フローのコンポーネント
コンポーネント タイプ
まとめ
開始ノード
すべてのメッセージ フローは開始ノードで始まります。すべてのメッセージは、開始ノードを介してメッセージ フローに入ります。また、すべての応答メッセージが開始ノードを介してクライアントに返されます。開始ノードでコンフィグレーションするものはありません。
パイプライン ペア ノード
パイプライン ペア ノードは、1 つの要求パイプラインと 1 つの応答パイプラインを 1 つの最上位要素に統合したものです。メッセージ フローでは、パイプライン ペア ノードが持つことができる直接の子孫は 1 つだけです。要求処理中に Oracle Service Bus がパイプライン ペア ノードを処理すると、要求パイプラインだけが実行される。Oracle Service Bus が応答パイプラインを処理すると、実行パスが反転される。
ステージ
要求パイプライン、応答パイプライン、およびエラー ハンドラには、ステージを含めることができます。ステージでは、パイプラインを通過するメッセージを処理するアクションをコンフィグレーションします。
エラー ハンドラ
ノードまたはステージで発生する可能性のあるエラーを処理するために、ノードまたはステージにエラー ハンドラを追加できます。
メッセージ フローでのエラー処理」も参照してください。
ブランチ ノード
ブランチ ノードを使用すると、可能ないくつかのパスのうちの 1 つに限定して処理を進めることができます。WSDL ベースのサービスでは、オペレーション ブランチがサポートされます。オペレーション ブランチでは、分岐は WSDL で定義された操作に基づいています。XPath ベースの切り替えテーブルで定義された条件では、条件付きブランチがサポートされます。
メッセージ フローの分岐」も参照してください。
ルート ノード
ルート ノードでは、別のサービスとの要求/応答通信が実行されます。ルート ノードはプロキシ サービスに関する要求処理と応答処理の境界を表します。ルート ノードが要求メッセージをディスパッチすると、要求処理が終了したと見なされる。ルート ノードが応答メッセージを受信したときに、応答処理が始まる。ルート ノードは、要求トランスフォーメーション、応答トランスフォーメーション、および条件付きルーティングに対応する。
ルート ノードは要求処理と応答処理の境界を表すので、メッセージ フロー内に子孫を持つことはできない。

図 3-1 は、メッセージ フロー定義のコンポーネントの概要を示しています。

図  3-1 メッセージ フローのコンポーネント

メッセージ フローのコンポーネント

メッセージ フローの構築

メッセージ フローの必須コンポーネントは、開始ノードとルート ノードだけです。メッセージ フローで連鎖できる他のコンポーネントに制限はありません。ルート ノードを 1 つ作成し、フローのすべてのロジックを格納できます。また、間にブランチ ノードを配置せずに 2 つのパイプライン ペア ノードを接続することもできます。ブランチ ノードを使用する場合、各ブランチ ノードはそれぞれ異なる要素で開始できます。あるブランチはルート ノードで終了し、別のブランチではパイプライン ペアが後続し、さらに別のブランチでは子孫を持たないようにすることができます (実行時に、子孫を持たないブランチを実行すると、応答処理がすぐに開始されます)。

ただし、一般には、メッセージ フローは次の形式のいずれかで設計します。

メッセージの実行

一般的なメッセージ フローでメッセージが処理されるしくみを表 3-2 に簡単に示します。

表 3-2 メッセージ フローでのメッセージのパス
メッセージ フロー ノード
メッセージ処理の内容
要求処理
 
開始ノード
開始ノードで要求処理が開始される。
パイプライン ペア ノード
要求パイプラインだけが実行される。
ブランチ ノード
ブランチ テーブルを評価し、関連するブランチに進む。
ルート ノード
要求トランスフォーメーションと共にルーティングが実行される。
メッセージ フローでは、ルーティングが実行されるかどうかに関係なく、ルート ノードは要求の処理から応答の処理への移行を表す。ルート ノードでは、メッセージ フローの方向は逆方向になる。要求パスにルート ノードが含まれていない場合、応答を待機せずに、応答処理は逆方向で開始される。
応答処理
ブランチ ノードをスキップして、ブランチの前にあるノードに進む。
ルート ノード
応答トランスフォーメーションが実行される。
ブランチ ノード
ブランチ ノードをスキップして、ブランチの前にあるノードに進む。
パイプライン ペア ノード
応答パイプラインが実行される。
開始ノード
クライアントに応答を返す。

 


メッセージ フローの分岐

メッセージ フローでは、2 種類の分岐がサポートされています。オペレーション ブランチ ノードでコンフィグレーションされるオペレーション ブランチと、条件付きブランチ ノードでコンフィグレーションされる条件付きブランチです

オペレーション ブランチ

メッセージ フローで WSDL ベースのプロキシ サービスを定義する場合、操作固有の処理が必要となります。メッセージ フローにオペレーション ブランチ ノードを作成すると、WSDL で定義された操作に基づいて分岐ロジックを作成できます。

プロキシ サービスが複数の操作を含む WSDL に基づいている場合は、オペレーション ブランチを使用する必要があります。この場合、オペレーション ブランチ ノードを使用して、操作ごとにメッセージを個別に処理することを検討できます。

条件付きブランチ

メッセージのドキュメント タイプなど、指定した条件に基づいて分岐する場合は、条件付きブランチを使用します。

条件付きブランチでは、ルックアップ テーブルに基づいて分岐が行われます。ルックアップ テーブルに含まれる各ブランチは、QuantityEqualToOrLessThan150QuantityMoreThan150 のような単純でユニークな文字列値でタグ付けされています。

(たとえば、メッセージ フロー内の前のステージで宣言された) メッセージ コンテキスト内の変数の値に基づいて分岐するように条件付きブランチをコンフィグレーションできます。また、ブランチ自体で定義された XPath 式の結果に基づいて分岐するように条件をコンフィグレーションすることもできます。

実行時に、変数または式が評価され、その結果値を使用してどのブランチに進むかが判断されます。値と一致するブランチがない場合は、デフォルト ブランチに進みます。ブランチ ノードでは、メッセージ フローに複数の子孫を持つことができます。ブランチごとにデフォルト ブランチが 1 つ含まれます。デフォルト ブランチを必ず定義する必要があります。ブランチ ノードに到達する前にルックアップ変数の値が設定されるように、プロキシ サービスを設計します。

たとえば、ルックアップ変数を使用する次のケースについて考えてみます。プロキシ サービスのタイプが任意の SOAP または任意の XML であり、条件付きブランチを実行できるようにメッセージのタイプを特定する必要があるとします。この場合、メッセージ タイプを特定するステージ アクションを設計した後に、メッセージ タイプに基づいて処理を分ける条件付きブランチ ノードをフロー内に設計できます。

今度は、条件付きブランチ ノードで XPath 式を使用するケースを考えてみます。注文の数量に基づいて分岐させるとします。この数量は、$body 内の既知の場所から取得できる変数によって渡されます。

数量を取得する次の XPath 式を定義できます。

declare namespace openuri="http://www.openuri.org/";
declare namespace com="oracle.com/demo/orders/cmnCust";
./openuri:processCust/com:cmnCust/com:Order_Items/com:Item/com:Quantity

メッセージ フローの下位に向かって、条件 (<500 など) が式に対して評価されます。最初に満たされた条件によって、次に進むべきブランチが決まります。どの分岐条件も満たされない場合は、デフォルト ブランチに進みます。

条件付きブランチを使用して、最上位のフロー ビューでメッセージ フローのルーティングの代替方法をエクスポーズできます。たとえば、メッセージ フローの初期の既知の条件 (メッセージ タイプなど) に基づいて、サービス A またはサービス B を呼び出す状況について考えてみます。ルート ノードのルーティング テーブルに条件付きブランチをコンフィグレーションできます。ただし、フローの最上位だけを調べる場合、この方法では分岐がやや困難になります。代わりに、条件付きブランチ ノードを使用して、メッセージ フロー自体にこのブランチをエクスポーズし、各ブランチのサブフローとして単純なルート ノードを使用できます。

メッセージ フロー、ステージ、またはルート ノードのどの場所にブランチをコンフィグレーションするかを決定する前に、ビジネス シナリオを検討してください。メッセージ フローにブランチをコンフィグレーションする場合、ブランチ ノードから多数のブランチが分岐すると、設計インタフェースが煩雑になる可能性があることに注意してください。

 


ステージおよびルート ノードでのアクションのコンフィグレーション

アクションは、パイプライン ステージ、エラー ハンドラ ステージ、およびルート ノードでメッセージを処理する手順を提供します。以下の節で説明するように、Oracle Service Bus Console または Workshop for WebLogic 用の Oracle Service Bus プラグインで使用できるアクションは、コンテキストによって決まります。

関連トピック

通信アクション

通信アクションは、メッセージ フローを制御します。各通信アクションを表 3-3 に示します。

表 3-3 通信アクション
アクション
用途
使用できる場所
動的パブリッシュ
Xquery 式で指定されたサービスにメッセージをパブリッシュします。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
  • ルート ノード
パブリッシュ
メッセージの静的に指定された対象サービスを特定し、メッセージをパッケージ化してその対象サービスに送信する方法をコンフィグレーションします。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
パブリッシュ テーブル
ゼロまたはそれ以上の静的に指定されたサービスにメッセージをパブリッシュします。切り替え式の条件ロジックを使用して、どのサービスをパブリッシュに使用するか実行時に決定します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
ルーティング オプション
発信要求の URI、サービスの品質、モード、再試行パラメータ、メッセージ優先度の各プロパティの一部またはすべてを変更します。
  • パイプライン ステージ
サービス コールアウト
Oracle Service Bus に登録済みのプロキシ サービスまたはビジネス サービスの同期 (ブロック) コールアウトをコンフィグレーションする。「サービス コールアウト メッセージの作成」を参照してください。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
転送ヘッダ
メッセージのヘッダ値を設定します。「メッセージ フローでの転送ヘッダのコンフィグレーション」を参照してください。
  • パイプライン ステージ
  • エラー ハンドラ ステージ

フロー制御アクション

フロー制御アクションは、条件付きルーティング、条件付きループ、およびエラー処理を実装します。また、フロー制御アクションを使用して、呼び出し元に成功を通知したり、ステージの残りのアクションをスキップしたりすることもできます。各フロー制御アクションを表 3-4 に示します。

表 3-4 フロー制御アクション
アクション
用途
使用できる場所
For each
値のシーケンスを反復処理し、アクションのブロックを実行します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
If... then...
XQuery 式のブール結果に基づいて、1 つのアクションまたは一連のアクションを条件付きで実行します。
  • パイプライン ステージ
  • ルート ノード
  • エラー ハンドラ ステージ
エラーを発生させる
指定されたエラー コード (文字列) と記述を含む例外を発生させます。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
返信
呼び出し元に即時返信を送信します。
返信アクションは、要求パイプライン、応答パイプライン、またはエラー パイプラインで使用できます。成功時または失敗時に返信するようにコンフィグレーションできます。HTTP·着信転送での失敗時の返信の場合、返信アクションでは、呼び出し元に即時に返信されるように指定します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
再開
エラー ハンドラによってエラーが処理された後、メッセージ フローを再開します。このアクションにパラメータはありません。このアクションは、エラー ハンドラでのみ使用できます。
  • エラー ハンドラ ステージ
スキップ
実行時に現在のステージの実行がスキップされ、メッセージ フローの次のステージに処理を進めます。このアクションにはパラメータがなく、要求パイプライン、応答パイプライン、エラー·パイプラインで使用できます。
  • パイプライン ステージ
  • エラー ハンドラ ステージ

メッセージ処理アクション

このカテゴリのアクションは、メッセージ フローを処理します。各メッセージ処理アクションを表 3-5 に示します。

表 3-5 メッセージ処理アクション
アクション
用途
使用できる場所
割り当て
コンテキスト変数に XQuery 式の結果を割り当てます。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
削除
XPath 式で指定されたコンテキスト変数または一連のノードを削除します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
挿入
XPath 式で選択したノードを基準として特定された場所に XQuery 式の結果を挿入します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
Java コールアウト
メッセージ フロー内から Java メソッド (EJB ビジネス サービス) を呼び出します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
MFL 変換
メッセージ パイプラインで、XML から非 XML または非 XML から XML にメッセージ コンテンツを変換します。MFL·は、バイナリ·データのレイアウトを記述するために使用する特別な·XML·ドキュメントです。Oracle 独自の言語を使用して、フォーマットされたバイナリ データを XML データに、または XML データをバイナリ データに変換するルールを定義します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
名前変更
要素のコンテンツを変更せずに、XPath 式で選択した要素の名前を変更します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
置換
XPath 式で指定されたノードまたはノードのコンテンツを置き換えます。ノードまたはそのコンテンツは、XQuery·式が返した値で置換されます。
置換アクションでは、単純な値、要素、属性を置き換えることができます。XQuery·式から何も返されない状態は、アクションがノード全体を置き換えるか、ノード·コンテンツのみを置き換えるかにより、識別されたノードを削除すること、または空のノードを作成することと同じです。
置換アクションは一連の更新アクションの 1 つです。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
検証
XML スキーマ要素または WSDL リソースに対して、XPath 式で選択した要素を検証します。検証できるのは、グローバル要素のみです。Oracle Service Bus はローカル要素に対する検証に対応していません。
  • パイプライン ステージ
  • エラー ハンドラ ステージ

レポート アクション

このカテゴリのアクションを使用して、ステージ内のメッセージ フローでの必要に応じて、エラーのログ記録またはレポート、およびアラートの生成を行います。各レポート アクションを表 3-4 に示します。

表 3-6 レポート アクション
アクション
用途
使用できる場所
アラート
パイプラインのメッセージ コンテキストに基づいてアラートを生成し、アラート送り先に送信します。SLA·アラートと異なり、アラート·アクションで生成された通知は、主にビジネスでの使用、またはエラーの報告を目的とし、システムの状態を監視するものではありません。アラート送り先のコンフィグレーションと選択は、この点を考慮して行う必要があります。
パイプライン アラートがサービスで有効になっていない場合や、ドメイン レベルで有効になっている場合は、メッセージを処理するときにコンフィグレーション済みのアラート アクションが省略されます。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
ログ
ログに記録するメッセージを作成し、メッセージをログに記録するときに使用する一連の属性を定義します。
  • パイプライン ステージ
  • エラー ハンドラ ステージ
レポート
プロキシ サービスのメッセージ レポートを有効にします。
  • パイプライン ステージ
  • エラー ハンドラ ステージ

メッセージ フローでの転送ヘッダのコンフィグレーション

転送ヘッダ アクションは、通信タイプのアクションです。このアクションは、パイプライン ステージとエラー ハンドラ ステージで使用できます。

転送ヘッダのグローバル パススルー オプションとヘッダ固有のコピー オプションのコンフィグレーション

転送ヘッダ アクションをコンフィグレーションするときに、以下のオプションを使用できます。

これらのオプションは、自分のシナリオに最適な方法で使用します。どちらのオプションを使用しても、ソース ヘッダ セットのヘッダがターゲット ヘッダ セットにコピーされ、ターゲット セットの既存の値はすべて上書きされます。[パイプラインを介してすべてのヘッダを渡す] オプションは、ヘッダ固有の「ヘッダをコピー」オプションの前に実行されます。つまり、特定の転送ヘッダ アクションのコンフィグレーションで、[パイプラインを介してすべてのヘッダを渡す] を選択した場合、特定のヘッダに対して「ヘッダをコピー」オプションを選択する必要はありません

ただし、[パイプラインを介してすべてのヘッダを渡す] を選択してすべてのヘッダをコピーし、その後に特定のヘッダに対して [ヘッダを削除] を選択して、個々のヘッダを削除するようにアクションをコンフィグレーションできます。

警告 : 転送ヘッダは転送タイプに固有であるため、パススルー (またはコピー) オプションは、同じ転送タイプのサービス間でヘッダをコピーする場合にのみ使用することをお勧めします。転送タイプが異なるサービス間でヘッダを渡す (またはコピーする) と、渡されるヘッダが対象の転送で受け入れられない場合にエラーが発生することがあります。同じ理由で、「ヘッダを設定」オプションを使用してヘッダ名を指定するときにも注意が必要です。

ランタイムによって転送ヘッダの設定が使用されるしくみについて

前述のように、転送ヘッダ アクションを使用して、発信要求 (ルート、パブリッシュ、またはサービス コールアウトの各アクションでプロキシ サービスが送信するメッセージ) と着信応答 (プロキシ サービスがクライアントに返信する応答メッセージ) の転送ヘッダの値をコンフィグレーションできます。通常、ヘッダ値に対して以下の操作を実行できます。

転送ヘッダ アクションを使用すると、$inbound または $outbound のヘッダを設定、削除、またはパススルーできます。これらのヘッダを設定または削除した後に、$inbound または $outbound をログに書き込むと、変更の影響を確認できます。ただし、メッセージが送信されるときに Oracle Service Bus バインディング レイヤによって $inbound または $outbound の一部のヘッダが変更または削除され、そのため基礎になる転送でこれらのヘッダの一部が無視されて、その転送固有の値が使用されることがあります。重要な違いは、バインディング レイヤによるヘッダの変更は $inbound および $outbound に対して直接行われますが、転送による変更はメッセージのワイヤ形式だけに影響するという点です。たとえば、発信の Content-Length ヘッダの値を指定することはできますが、メッセージの送信時に、この値はバインディング レイヤによって $outbound から削除されます。したがって、この変更は応答パスで確認できます (たとえば、$outbound をログに記録すると、変更された値を確認できます)。$outboundUser-Agent ヘッダを設定した場合、HTTP 転送ではこの設定が無視され、転送独自の値が使用されます。ただし、$outbound の値が変更されることはありません。

実行時に無視または上書きされる転送ヘッダと、特定の転送ヘッダに関するその他の制限を表 3-7 に示します。

表 3-7 転送ヘッダ アクションで指定する転送ヘッダの値の制限
転送
制限の説明
制限の影響を受ける転送ヘッダ
発信要求
着信応答
HTTP
Oracle Service Bus ランタイムは、メッセージの送信準備中にバインディング レイヤでこれらのヘッダを上書きする場合がある。これらのヘッダが変更された場合、それに応じて $inbound と $outbound が更新されます。
  • Content-Type
  • Content-Type
 
メッセージの送信時に、基になる転送でこれらのヘッダが無視され、別の値が使用される場合があります。転送によって行われた変更は、$inbound または $outbound には反映されません。
  • Accept
  • Content-Length
  • Connection
  • Host
  • User-Agent
  • Content-Length
  • Date
  • Transfer-Encoding
JMS
要求が一方向のサービスまたは JMSMessageID 相関に基づく要求/応答サービスに関連する場合にのみ設定できます。
JMSCorrelationID 相関に基づく要求/応答サービスに送信する場合、これらのヘッダは実行時に上書きされます。
  • JMSCorrelationID
  • JMSCorrelationID
 
メッセージの生存時間をミリ秒単位で設定する必要があります。受信したメッセージの結果値は、クライアントが指定する生存時間の値と、送信時またはパブリッシュ時の GMT の合計になります1
  • JMSExpiration
  • JMSExpiration
 
Oracle Service Bus ランタイムはこれらのヘッダを設定する。つまり、設計時にこれらのヘッダに対して行った指定内容は実行時に上書きされます。
  • JMSMessageID
  • JMSRedelivered
  • JMSTimestamp
  • JMSXDeliveryCount
  • JMSXUserID
  • JMS_IBM_PutDate2
  • JMS_IBM_PutTime2
  • JMS_IBM_PutApplType2
  • JMS_IBM_Encoding2
  • JMS_IBM_Character_Set2
  • JMSMessageID
  • JMSRedelivered
  • JMSTimestamp
  • JMSXDeliveryCount
  • JMSXUserID
  • JMS_IBM_PutDate2
  • JMS_IBM_PutTime2
  • JMS_IBM_PutApplType2
  • JMS_IBM_Encoding2
  • JMS_IBM_Character_Set2
 
IBM MQ ではクライアント アプリケーションで一部のプロパティを設定できないため、IBM MQ 送り先に関連するこれらのヘッダを設定すると、実行時例外が発生します。
  • JMSXDeliveryCount
  • JMSXUserID
  • JMSXAppID
  • JMSXDeliveryCount
  • JMSXUserID
  • JMSXAppID
 
[パイプラインを介してすべてのヘッダを渡す] オプションも指定されている場合、これらのヘッダを削除することはできません。
  • JMSDeliveryMode
  • JMSExpiration
  • JMSMessageID
  • JMSRedelivered
  • JMSTimestamp
  • JMSXDeliveryCount
  • JMSDeliveryMode
  • JMSExpiration
  • JMSMessageID
  • JMSRedelivered
  • JMSTimestamp
  • JMSXDeliveryCount
  • JMSCorelationID - 着信メッセージに相関 ID が設定されている場合。たとえば、登録済みの JMS ビジネス サービスからの着信応答の場合など。
FTP
制限はありません。つまり、ユーザはファイル転送および FTP 転送のヘッダ3 を設定または削除することができ、ユーザによる指定は Oracle Service Bus ランタイムで優先される。
   
ファイル
   
電子メール
Oracle Service Bus ランタイムはこれらのヘッダを設定する。つまり、設計時にこれらのヘッダに対して行った指定内容は実行時に上書きされます。
  • Content-Type
  • Content-Type
 
Oracle Service Bus は発信リクエスト用のこれらのヘッダを使用しません。これらを動的に (つまり、これらを $outbound ヘッダ セクションに設定する場合) 設定すると、Oracle Service Bus はこれらを無視します。
これらのヘッダは $inbound で受信されます。Date は、送信者が電子メールを送信した日時です。From は、受信電子メール ヘッダから取得されます。
  • 送信元の名前
  • Date
 

1 たとえば、JMSExpiration ヘッダを 1000 に設定し、送信時に GMT が 1,000,000 (System.currentTimeMillis() の結果) である場合、JMS メッセージの JMSExpiration プロパティの結果値は 1,000,1000 になります。

2 JMS_IBM というプレフィックスの付いたヘッダ名は、IBM MQ サーバがホストする送り先に関連して使用されます。

3 FTP プロキシとファイル プロキシでは、「fileName」という転送要求ヘッダがあります。この要求ヘッダの値は、ポーリング対象となるファイルの名前です。

注意 : inbound コンテキスト変数と outbound コンテキスト変数を設定する場合や、Oracle Service Bus Test Console を使用してプロキシ サービスまたはビジネス サービスをテストする場合は、転送ヘッダとメタデータの設定のときと同じ制限が適用されます。

 


メッセージ フローでのトランスフォーメーションの実行

トランスフォーメーション マップは、2 つのデータ型の間のマッピングを記述したものです。Oracle Service Bus は、XQuery および eXtensible Stylesheet Language Transformation (XSLT) 標準を使用したデータ マッピングに対応しています。XSLT マップでは、XML から XML へのマッピングを記述します。XQuery マップでは、XML から XML、XML から非 XML、および非 XML から XML への各マッピングを記述できます。

メッセージ フロー内にトランスフォーメーションを指定する位置は、以下の条件によって異なります。

トランスフォーメーションとパブリッシュ アクション

トランスフォーメーションをパブリッシュ アクション内に設計した場合、トランスフォーメーションは $outbound 変数およびメッセージ関連の変数 ($header$body、および $attachments) のローカル コピーを保持します。パブリッシュ アクションで発信メッセージに行った変更は、パブリッシュされるメッセージにのみ反映されます。つまり、パブリッシュ アクションで行った変更は、メッセージ フローがその次のアクションに進む前にロールバックされます。

たとえば、メッセージ フローで大口の発注書を処理するときに、管理者宛てに発注書の要約を電子メールで送信する必要がある場合について考えます。このような場合、要求パイプラインにパブリッシュ アクションを含めると、着信メッセージの SOAP 本体に発注書の要約が作成されます。パブリッシュ アクションでは、発注書データが発注書の要約に変換されます。たとえば、発注書の要約には添付ファイルは必要ないため、$attachments のすべての添付ファイルを削除できます。

トランスフォーメーションとルート ノード

WS-Addressing ヘッダに基づく 2 つの送り先の一方にメッセージをルーティングする必要があるとします。この場合、コンテンツ ベースのルーティングです。また、もう一方の送り先では、SOAP 本体のドキュメントの新しいバージョンが必要であるとします。このような場合、条件に基づいて 2 つの送り先の一方にルーティングされるように、ルート ノードをコンフィグレーションできます。2 つ目の送り先のためにドキュメントを変換するように、ルート ノードでトランスフォーメーションをコンフィグレーションします。

発信コンテキスト変数 ($outbound) の制御要素を設定して、発信メッセージに関するシステムの動作を調整できます (たとえば、サービスの品質を設定できます)。

inbound 変数と outbound 変数の下位要素、およびメッセージ コンテキストの変数の値を使用してメッセージのコンテンツが作成されるしくみについては、「inbound 変数と outbound 変数」および「送信するメッセージの作成」を参照してください。

関連トピック

 


サービス コールアウト メッセージの作成

Oracle Service Bus がサービス コールアウト アクションを通じてサービスを呼び出す場合は、メッセージ コンテキストの変数の値を使用してメッセージのコンテンツが作成されます。発信メッセージのメッセージ コンテンツは、ターゲット サービスの種類に応じて異なって処理されます。

以下のトピックで説明するように、メッセージ コンテンツの作成方法は、対象サービスのタイプ、および SOAP 本体とペイロード (パラメータまたはドキュメント) のどちらをコンフィグレーションするかによって異なります。

SOAP ドキュメント スタイルのサービス

次のような SOAP ドキュメント スタイルのサービス (EJB ドキュメントおよびドキュメントにラップされたサービスを含む) のメッセージを作成できます。

SOAP ドキュメント スタイルのサービスへのコールアウト時にメッセージが作成されるしくみを説明するために、次のようにコンフィグレーションされたサービス コールアウト アクションについて考えてみます。

また、実行時に要求ドキュメント変数 myreq が次の XML にバインドされていることを前提とします。

コード リスト 3-1 要求変数 (myreq) のコンテンツ
<sayHello xmlns="http://www.openuri.org/">
    <intVal>100</intVal>
    <string>Hello Oracle</string>
</sayHello>

実行時に、SOAP 要求ヘッダ変数 reqheader は、次の SOAP ヘッダにバインドされます。

コード リスト 3-2 SOAP 要求ヘッダ変数 (reqheader) のコンテンツ
<soap:Header xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/
xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing">
    <wsa:Action>...</wsa:Action>
    <wsa:To>...</wsa:To>
    <wsa:From>...</wsa:From>
    <wsa:ReplyTo>...</wsa:ReplyTo>
    <wsa:FaultTo>...</wsa:FaultTo>
  </soap:Header>

このシナリオ例では、外部サービスに送信されるメッセージの本文全体はコード リスト 3-3 のようになります (myreq 変数と reqheader 変数のコンテンツは太字で示しています)。

コード リスト 3-3 サービス コールアウト アクションの結果としてサービスに送信されるメッセージ
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/
    xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing">
        <wsa:Action>...</wsa:Action>
        <wsa:To>...</wsa:To>
        <wsa:From>...</wsa:From>
        <wsa:ReplyTo>...</wsa:ReplyTo>
        <wsa:FaultTo>...</wsa:FaultTo>
    </soap:Header>
    <soapenv:Body>
        <sayHello xmlns="http://www.openuri.org/">
            <intVal>100</intVal>
            <string>Hello Oracle</string>
        </sayHello>
    </soapenv:Body>
</soapenv:Envelope>

上記のサービス コールアウト アクションのコンフィグレーションに基づいて、サービスからの応答が myresp 変数に割り当てられます。外部サービスからの応答全体は、コード リスト 3-4 のようになります。

コード リスト 3-4 サービス コールアウト アクションの結果としてのサービスからの応答メッセージ
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenc="http://schemas.xmlsoap.
org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <env:Header/>
    <env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <m:sayHelloResponse xmlns:m="http://www.openuri.org/">
            <result xsi:type="xsd:string">This message brought to you by Hello Oracle and the number 100
            </result>
        </m:sayHelloResponse>
    </env:Body>
</env:Envelope>

このシナリオでは、myresp 変数にコード リスト 3-5 に示す値が割り当てられます。

コード リスト 3-5 サービス コールアウト アクションの結果としての応答変数 (myresp) のコンテンツ
<m:sayHelloResponse xmlns:m="http://www.openuri.org/">
    <result ns0:type="xsd:string" xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance">
This message brought to you by Hello Oracle and the number 100
    </result>
</m:sayHelloResponse>

SOAP RPC スタイルのサービス

次のような SOAP RPC スタイルのサービス (EJB RPC サービスを含む) のメッセージを作成できます。

SOAP RPC スタイルのサービスへのコールアウト時にメッセージが作成されるしくみを説明するために、次のようにコンフィグレーションされた例について考えてみます。

このシナリオでは、サービスへの発信メッセージの本文はコード リスト 3-6 のようになります。

コード リスト 3-6 発信メッセージのコンテンツ
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <sayHello2 xmlns="http://www.openuri.org/">
            <intVal>100</intVal>
            <string >Hello Oracle</string>
        </sayHello2>
    </soapenv:Body>
</soapenv:Envelope>

呼び出しが行われたサービスから返される応答は、コード リスト 3-7 のようになります。

コード リスト 3-7 helloWorld サービスからの応答メッセージのコンテンツ
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <env:Header/>
    <env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <m:sayHello2Response xmlns:m="http://www.openuri.org/">
            <result xsi:type="n1:HelloWorldResult" xmlns:n1="java:">
                <message xsi:type="xsd:string">
                This message brought to you by Hello Oracle and the number 100
                </message>
            </result>
        </m:sayHello2Response>
    </env:Body>
</env:Envelope>

メッセージ コンテキスト変数 output1 には、コード リスト 3-8 に示す値が割り当てられます。

コード リスト 3-8 出力変数 (output1) のコンテンツ
<message ns0:type="xsd:string" xmlns:ns0="http://www.w3.org/2001/XMLSchema-intance">
This message brought to you by Hello Oracle and the number 100</message>

XML サービス

次のような XML サービスのメッセージを作成できます。

XML サービスへのコールアウト時にメッセージが作成されるしくみを説明するために、次のようにコンフィグレーションされたサービス コールアウト アクションを例にとります。

また、実行時に要求ドキュメント変数 myreq が次の XML にバインドされることを前提とします。

コード リスト 3-9 myreq 変数のコンテンツ
<sayHello xmlns="http://www.openuri.org/">
    <intVal>100</intVal>
    <string>Hello Oracle</string>
</sayHello>

このシナリオの特徴は以下のとおりです。

メッセージング サービス

メッセージング サービスの場合の特徴は以下のとおりです。

たとえば、要求メッセージのコンテキスト変数 myreq が <hello>there</hello> という形式の XML ドキュメントにバインドされる場合、発信メッセージには厳密にこのペイロードが格納されます。応答メッセージのコンテキスト変数 (myresp) は、次のような参照要素にバインドされます。

<binary-content ref=" cid:1850733759955566502-2ca29e5c.1079b180f61.-7fd8"/>

 


サービス コールアウトの結果としてのエラー処理

エラー処理は、メッセージ フロー、パイプライン、ルート ノード、およびステージ レベルでコンフィグレーションできます。サービス コールアウトの結果として外部サービスから受け取るエラーのタイプには、転送エラー、SOAP エラー、予期される応答に一致しない応答などがあります。

fault コンテキスト変数の設定は、返されるエラーのタイプごとに異なります。fault 変数のコンテンツに基づいて、ビジネス ロジックとエラー処理ロジックを構築できます。$fault の詳細については、「fault 変数」を参照してください。

転送エラー

外部サービスから転送エラーを受け取り、転送プロバイダから Oracle Service Bus にエラー応答ペイロードが返されない場合 (たとえば、HTTP 403 のエラー コードが返された場合)、サービス コールアウト アクションは例外をスローします。これにより、パイプラインでエラーが発生します。ユーザがコンフィグレーションしたエラー ハンドラの fault 変数は、コード リスト 3-11 に示すメッセージと同様にフォーマットされたメッセージにバインドされます。

コード リスト 3-11 Oracle Service Bus の fault 変数のコンテンツ - 転送エラー、エラー応答ペイロードなし
<con:fault xmlns:con="http://www.bea.com/wli/sb/context">
  <con:errorCode>BEA-380000</con:errorCode>
  <con:reason>Not Found</con:reason>
   <con:details>
   .......
   </con:details>
    <con:location>
       <con:node>PipelinePairNode1</con:node>
       <con:Pipeline>PipelinePairNode1_request</con:Pipeline>
    <con:Stage>Stage1</con:Stage>
    </con:location>
</con:fault>

転送エラーに関連付けられたペイロードがある場合 (たとえばビジネス サービスから HTTP 500 のエラー コードを受け取り、応答内に XML ペイロードがある場合)、カスタム エラー コード BEA-382502 のメッセージ コンテキスト エラーが生成されます。

サービスが HTTP または JMS 転送を使用している場合に、そのサービスからの応答の結果として BEA-382502 エラー応答コードがトリガされるには、次の条件が満たされる必要があります。

転送が HTTP の場合、ErrorResponseDetail 要素には応答と共に返される HTTP エラー コードも含まれます。fault 内の ErrorResponseDetail 要素には、サービスから受信したエラー応答ペイロードが含まれます。ErrorResponseDetail 要素の例をコード リスト 3-12 に示します。

コード リスト 3-12 Oracle Service Bus の fault 変数のコンテンツ - 転送エラー、エラー応答ペイロードあり
<ctx:Fault xmlns:ctx="http://www.bea.com/wli/sb/context">
    <ctx:errorCode>BEA-382502<ctx:errorCode>
    <ctx:reason> Service callout has received an error response from the server</ctx:reason>
    <ctx:details>
        <alsb:ErrorResponseDetail xmlns:alsb="http://www.oracle.com/...">
            <alsb:detail> <![CDATA[
. . .                 
]]>
            </alsb:detail>           <alsb:http-response-code>500</alsb:http-response-code>
        </alsb:ErrorResponseDetail>
    </ctx:details>
    <ctx:location>. . .</ctx:location>
</ctx:Fault>
注意 : サービス コールアウトで生成されるエラーの XML スキーマについては、「サービス コールアウトで生成されるエラーの詳細の XML スキーマ」を参照してください。

SOAP エラー

外部サービスが SOAP エラーを返した場合、Oracle Service Bus ランタイムは、カスタム エラー コードとエラーの詳細を示す説明を含むコンテキスト変数 $fault を設定します。そのために、SOAP エラーの <SOAP-ENV:Fault> 要素の下にある 3 つの要素のコンテンツが抽出され、Oracle Service Bus の fault 要素の作成に使用されます。

サービスが次のエラーを返すシナリオを例にとります。

コード リスト 3-13 サービス コールアウトから返される SOAP エラー
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>SOAP-ENV:Client</faultcode>
      <faultstring>Application Error</faultstring>
      <detail>
        <message>That’s an Error!</message>
        <errorcode>1006</errorcode>
      </detail>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

<faultcode><faultstring><detail> の各要素が抽出され、<alsb:ReceivedFault> 要素にラップされます。コード リスト 3-15faultcode 要素には QName が含まれ、関連するすべてのネームスペース宣言が保持されます。転送が HTTP の場合、ReceivedFault 要素にはエラー応答と共に返される HTTP エラー コードも含まれます。

生成される <alsb:ReceivedFault> 要素、およびカスタム エラー コードとエラー文字列は、fault コンテキスト変数のコンテンツの作成に使用されます。この例では、コード リスト 3-14 と同様の形式になります。

コード リスト 3-14 Oracle Service Bus の fault 変数のコンテンツ - SOAP エラー

<ctx:Fault xmlns:ctx="http://www.bea.com/wli/sb/context">
    <ctx:errorCode>BEA-382500<ctx:errorCode>
    <ctx:reason> service callout received a soap Fault response</ctx:reason>
    <ctx:details>
        <alsb:ReceivedFault xmlns:alsb="http://www.oracle.com/...">
            <alsb:faultcode
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">SOAP-ENV:Clien
            </alsb:faultcode>
            <alsb:faultstring>Application Error</alsb:faultstring>
            <alsb:detail>
                <message>T
hat’s an Error!</message>
                <errorcode>1006</errorcode>
            </alsb:detail>

          <alsb:http-response-code>500</alsb:http-response-code>
        </alsb:ReceivedFault>
    </ctx:details>
    <ctx:location> </ctx:location>
</ctx:Fault>

注意 : ユニークなエラー コード BEA-382500 は、サービス コールアウト アクションが SOAP エラー応答を受け取ったときに備えて予約されています。

予期しない応答

プロキシ サービスのランタイムが予期していない応答メッセージがサービスから返された場合、メッセージ コンテキスト エラーが生成され、カスタム エラー コード BEA-382501 で初期化されます。エラーの詳細には応答の SOAP-Body 要素のコンテンツが含まれます。転送が HTTP の場合、ReceivedFault 要素にはエラー応答と共に返される HTTP エラー コードも含まれます。

サービス コールアウトで生成されるエラーの詳細の XML スキーマ定義をコード リスト 3-15 に示します。

コード リスト 3-15 サービス コールアウトで生成されるエラーの詳細の XML スキーマ
<xs:complexType name="ReceivedFaultDetail">
        <xs:sequence>
            <xs:element name="faultcode" type="xs:QName"/>
            <xs:element name="faultstring" type="xs:string"/>
            <xs:element name="detail" minOccurs="0" >
               <xs:complexType>
                 <xs:sequence>
                        <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
                 </xs:sequence>
        <xs:anyAttribute namespace="##any" processContents="lax" />
               </xs:complexType>
            </xs:element>
            <xs:element name="http-response-code" type="xs:int" minOccurs="0"/>\
type="xs:int" minOccurs="0"/>
        </xs:sequence>
</xs:complexType>

<xs:complexType name="UnrecognizedResponseDetail">
        <xs:sequence>
            <xs:element name="detail" minOccurs="0" type="xs:string" />
        </xs:sequence>
</xs:complexType>

<xs:complexType name="ErrorResponseDetail">
        <xs:sequence>
            <xs:element name="detail" minOccurs="0" type="xs:string" />
        </xs:sequence>
</xs:complexType>

 


メッセージ フローでのエラー処理

次のパラグラフで説明するプロセスでは、エラー ハンドラ ステージのエラー処理パイプラインを構成します。また、エラー パイプラインは、パイプライン (要求または応答) またはプロキシ サービス全体に対して定義することができます。

ステージ レベルのエラー ハンドラがエラー処理に呼び出されます。ステージ レベルのエラー ハンドラが特定タイプのエラーを処理できない場合、パイプライン エラー ハンドラが呼び出されます。パイプライン レベルのエラー ハンドラもエラーを処理できない場合は、サービス レベルのエラー ハンドラが呼び出されます。サービス レベルのエラー ハンドラも処理できない場合、システムがエラーを処理します。メッセージ フローのさまざまなレベルにおけるエラー ハンドラのスコープの概要を次の表に示します。

表 3-8 エラー ハンドラのスコープ
レベル
スコープ
ステージ
ステージ内のすべてのエラーを処理する。
パイプライン
パイプラインのステージの未処理のエラーと共に、パイプラインのすべてのエラーを処理する。
サービス
サービスのパイプラインの未処理のエラーと共に、パイプラインのすべてのエラーを処理する。

注意 : WS-Security エラーはすべてこのレベルで処理される。

システム
パイプラインで処理されないすべてのエラーを処理する。

注意 : エラー ハンドラのスコープには例外があります。たとえば、ステージ レベルの非 XML トランスフォーメーションによって送出される例外を捕捉するのは、サービス レベルのエラー ハンドラのみです。プロキシ サービスの送信応答メッセージ用に XML から MFL に変換する場合、このトランスフォーメーションは常にバインディング レイヤで発生します。したがって、たとえば、非 XML 出力でステージ レベルの必須フィールドが欠落している場合、サービス レベルのエラー ハンドラだけがこのエラーを捕捉できます。

エラー メッセージとエラー処理の詳細については、『Oracle Service Bus Console の使い方』の「プロキシ サービス : エラー ハンドラ」を参照してください。

アサーションが true であるかどうかを確認するテストをコンフィグレーションすることでエラーを処理できます。また、失敗にコンフィグレーションされている応答アクションを使用できます。このテストはさまざまなレベルで繰り返すことができます。下位レベルでエラー ハンドラのない状態でエラーが発生した場合、メッセージ フローの上位レベルのエラー ハンドラによって処理することもできます。

通常、メッセージ フローのステージ レベルで特定のエラーを処理し、下位レベルでは処理されないエラーのより一般的なデフォルト処理に上位レベルのエラー ハンドラを使用する方が簡単です。予期されるエラーをパイプラインで明示的に処理し、予期されないエラーをサービスレベルのハンドラで処理することをお勧めします。

注意 : サービス レベルで処理できるのは、WS-Security 関連のエラーのみです。

エラー メッセージの生成、レポート、および返信

メッセージ処理中に発生したエラーに関する情報はすべて、事前定義されたコンテキスト変数 (fault 変数) に保持されます。エラーが発生すると、この変数に情報が格納されてから、適切なエラー ハンドラが呼び出されます。この fault 変数はエラー ハンドラ パイプラインでのみ定義され、要求パイプラインや応答パイプライン、ルート ノードやブランチ ノードでは設定されません。$fault の詳細については、「事前定義されたコンテキスト変数」を参照してください

要求/応答型の着信メッセージでのエラー発生時には、多くの場合、エラーが発生した理由を説明するメッセージを送信元に返送する必要があります。そのためには、送信する応答に対してメッセージ コンテキスト変数をコンフィグレーションした後、失敗時の返信アクションを使用します。たとえば、HTTP メッセージが失敗した場合は、失敗時の返信アクションで HTTP 500 ステータスが生成されます。JMS メッセージが失敗した場合は、失敗時の返信アクションで JMS_BEA_Error プロパティが true に設定されます。Oracle Service Bus のエラー アクションについては、『Oracle Service Bus Console の使い方』の「プロキシ サービス : エラー ハンドラ」を参照してください。

プロキシ サービスが呼び出したサービスが SOAP エラーまたは転送エラーを返すと、エラー処理パイプラインが呼び出されます。受信した SOAP エラーはすべて $body に格納されるため、$body を変更せずに失敗時の返信アクションを実行すると、サービスの呼び出し元のクライアントには元の SOAP エラーが返されます。返信アクションがコンフィグレーションされていない場合、システム エラー ハンドラによって新しい SOAP エラー メッセージが生成されます。プロキシ サービスでは、HTTP エラー ステータスが設定されたか、JMS プロパティ SERVER_Error が true に設定されているために SOAP エラーが返されたと認識されます。

用途によっては、エラー レポートが必要な場合があります。このような場合は、レポート アクションを使用します。たとえば、要求パイプラインで追跡用にメッセージをレポートするレポート アクションを実行した後、ルート ノードによって呼び出されたサービスが失敗するというシナリオを想定します。このような場合、メッセージはレポート システムによってログに記録されますが、メッセージが正常に処理されたという保証はありません。メッセージが正常に受信されたことを示すだけです。

Oracle Service Bus Console では、メッセージを追跡することによって、メッセージ フローの正確な流れを把握することができます。これにより、メッセージが処理のために送信されたことをレポートする元のメッセージだけでなく、メッセージが正常に処理されなかったことをレポートする以降のエラーも確認できます。レポート アクションをコンフィグレーションし、実行時にレポートされるデータを使用する方法については、『Oracle Service Bus Console の使い方』の「プロキシ サービス : アクション」を参照してください

エラー ハンドラでのアクションのコンフィグレーションの例

この例では、エラー ハンドラにレポート アクションと返信アクションをコンフィグレーションする方法を示します。図 3-2 に示すメッセージ フローには、validate loan application ステージのエラー ハンドラが含まれています。この例のエラー ハンドラは、1 つのステージがコンフィグレーションされた単純なメッセージ フローです。Oracle Service Bus Console には、図 3-2 のように表示されます。

図 3-2 エラー ハンドラのメッセージ フロー

エラー ハンドラのメッセージ フロー

図 3-3 に示すように、このステージはアクション (置換、レポート、および返信) でコンフィグレーションされています。

図 3-3 ステージ エラー ハンドラのアクション

ステージ エラー ハンドラのアクション

アクションによって、パイプライン エラー ハンドラのステージの動作が次のように制御されます。

コンフィグレーション情報については、『Oracle Service Bus Console の使い方』の「プロキシ サービス : エラー ハンドラを参照してください。

 


動的ルーティングの使用

作成するプロキシ サービスから呼び出す必要があるサービスがわからない場合に、動的ルーティングを使用できます。

どのプロキシ サービスでも、以下のいずれかの方法を使用して、メッセージを動的にルーティングできます。

動的ルーティングの実装

動的ルーティングを使用すると、プロキシ サービスの実行時に送り先を確定できます。これを行うには、XML ファイルのルーティング テーブルを使用して、XQuery リソースを作成します。

注意 : XQuery リソースを使用する代わりに、リソースの作成元の XML ファイルを直接使用することもできます。

XML ファイルまたは XQuery リソースは容易に保持できます。実行時に、プロキシ サービスのルーティング先またはパブリッシュ先を決定するルーティング テーブルにエントリを指定します。XML ファイルまたは XQuery リソースには、論理的な識別子 (企業名など) を物理的な識別子 (Oracle Service Bus のサービスの完全修飾名) にマップするルーティング テーブルが含まれています。メッセージから抽出された論理的な識別子は、呼び出すサービスの名前である物理的な識別子にマップされます。

注意 : 動的ルート アクションを使用するには、Oracle Service Bus のサービスの完全修飾名が必要です。

パイプラインでは、論理的な修飾子は XPath を使用してメッセージに取得されます。XQuery リソースの XML テーブルを変数に割り当てます。ルーティング テーブルの変数にクエリを実装し、対応する論理的な修飾子に基づいて物理的な修飾子を抽出します。この変数を使用すると、必要なサービスを呼び出すことができます。以下の節では、動的ルーティングの実装方法を説明します。

サンプル XML ファイル

以下の XML ファイルから XQuery リソースを作成できます。sampleXquery.xml としてこれを保存します。

コード リスト 3-16 サンプル XML ファイル
<routing>
   <row>
      <logical>Oracle</logical>
      <physical>default/goldservice</physical>
   </row>
   <row>
      <logical>ABC Corp</logical>
      <physical>default/silverservice</physical>
   </row>
</routing>

サンプル XML からの XQuery リソースの作成

  1. アクティブ セッションで、左側のナビゲーション パネルから [プロジェクト エクスプローラ] を選択します。[プロジェクト ビュー] ページが表示されます。
  2. XQuery リソースの追加先となるプロジェクトを選択します。
  3. [プロジェクト ビュー] ページで、[リソースの種類の選択] ドロップダウン リストから [XQuery リソース] を選択します。XQuery の作成ページが表示されます。
  4. [リソース] フィールドにリソースの名前を入力します。これは必須です。
  5. [リソースの説明] フィールドにリソースの説明を入力します。これは省略可能です。
  6. [XQuery] フィールドに、XQuery リソースとして使用する XML へのパスを指定します。[参照] をクリックしてファイルを検索します。また、XML をコピーして [XQuery] フィールドに貼り付けることもできます。これは必須です。
  7. XQuery リソースを保存します。
  8. セッションをアクティブ化します。

動的ルーティングを実装するためのプロキシ サービスの作成およびコンフィグレーション

  1. アクティブ セッションで、左側のナビゲーション パネルから [プロジェクト エクスプローラ] を選択します。[プロジェクト ビュー] ページが表示されます。
  2. プロキシ サービスの追加先となるプロジェクトを選択します。
  3. [プロジェクト ビュー] ページで、[リソースの種類の選択] ドロップダウン リストから [プロキシ サービス] リソースを選択します。[全般的なコンフィグレーション] ページが表示されます。
  4. [全般的なコンフィグレーション] ページの [サービス名] フィールドに、プロキシ サービスの名前を入力します。これは必須です。
  5. [サービスの種類] で使用できるさまざまなサービスのタイプの横にあるボタンをクリックして、サービスのタイプを選択します。サービスのタイプの選択方法の詳細については、「プロキシ サービス : アクション」を参照してください。
  6. [完了] をクリックします。[概要] ページで [保存] をクリックして、プロキシ サービスを保存します。
  7. [プロジェクト ビュー] ページで、[リソース] テーブルの新しく作成したプロキシ サービスに対して [メッセージ フローの編集] アイコンをクリックします。[メッセージ フローの編集] ページが表示されます。
  8. メッセージ フローをクリックして、パイプライン ペアをメッセージ フローに追加します。
  9. [要求パイプライン] アイコンをクリックし、メニューから [ステージの追加] を選択します。
  10. [Stage1] アイコンをクリックし、メニューから [ステージの編集] を選択します。[ステージ コンフィグレーションの編集] ページが表示されます。
  11. [アクションの追加] アイコンをクリックします。メニューから [アクションの追加] 項目を選択します。
  12. [メッセージ処理] から [割り当てる] アクションを選択します。
  13. [] をクリックします。[XQuery 式エディタ] が表示されます。
  14. [XQuery リソース] をクリックします。ブラウザに、XQuery リソースをインポートできるページが表示されます。[参照] をクリックして XQuery リソースを検索します。
  15. 検証] をクリックしてインポートした XQuery リソースを検証します。
  16. 検証が成功したら、インポートした XQuery 式を保存します。
  17. [ステージ コンフィグレーションの編集] ページで、フィールドに変数の名前を入力します
  18. これにより、XQuery リソースがこの変数に割り当てられます。これで、この変数に外部化したルーティング テーブルが格納されました。

  19. [割り当て] アクション アイコンをクリックして、別の割り当てアクションを追加します。
  20. 注意 : これを行うには、手順 11 から手順 13 を繰り返します
  21. 以下の XQuery を入力します。
  22. <ctx: route>
    <ctx: service isProxy=’false’> {$routingtable/row[logical/text()=$logicalidentifier]/physical/text()}
    </ctx: service>
    </ctx: route>

    上記のコードで、$logicalidentifier を実際の XPath で置換して、メッセージ ($body など) から論理的な識別子を抽出します。

  23. [検証] をクリックして、XQuery を検証します。
  24. 検証が成功したら、XQuery を保存します。
  25. [ステージ コンフィグレーションの編集] ページで、フィールドに変数の名前を入力します。たとえば、「routeresult」と入力します。
  26. これにより、動的ルート アクションで使用する XML がこの変数に抽出されます。

  27. メッセージ フローをクリックして、ルート ノードをメッセージ フローの最後に追加します。
  28. [ルート ノード] アイコンをクリックし、メニューから [編集] を選択します。
  29. [アクションの追加] アイコンをクリックします。メニューから [アクションの追加] 項目を選択します。
  30. [動的ルーティング] アクションを選択します。
  31. [] をクリックします。XQuery 式エディタが表示されます。
  32. 手順 22 の変数 (たとえば、$routeresult) を入力します

 


XQuery を使用したデータベースへのアクセス

Oracle Service Bus では、カスタムの EJB コードや Java コードを記述したり、Oraclce Data Service Integrator などの別のデータベース製品を使用せずに、プロキシ サービスからデータベースに対して読み込みアクセスを行うことができます。execute-sql() 関数を使用して、データベースに対して簡単な JDBC 呼び出しを行い、単純なデータベースの読み込みを実行できます。指定した地域の税率を取得する単純なクエリや、複雑な結合を使用して、基になる複数のデータベース テーブルから注文の現在の状態を取得するクエリなど、任意の SQL クエリが有効です。

データベース クエリを使用してデータを取得し、メッセージに情報を追加したり、ルーティング先を選択したり、プロキシ サービスの動作をカスタマイズすることができます。Oracle Service Bus プロキシ サービスが「見積依頼」メッセージを受信する場合のシナリオを例として示します。プロキシ サービスは、顧客の優先度に基づいて、見積りを提供する複数のビジネス サービス (たとえば標準、ゴールド、プラチナ レベルのサービス) のいずれかに要求をルーティングできます。その後で、プロキシ サービスは、それらのサービスが返す結果を SQL ベースで補強します。たとえば、選択した出荷方法と注文品の重量に基づいて送料を検索し、そのコストを見積依頼メッセージに追加することができます。

関数の構文とその使用例については、「fn-bea:execute-sql()」を参照してくださいexecute-sql() 関数は型付きデータを返し、SQL/JDBC データ モデルと XQuery データ モデル間で値を自動的に変換します。

返された要素を、Oracle Service Bus メッセージ フローのユーザ定義の変数に格納できます。

execute-sql() 関数でサポートされるデータベースおよび JDBC ドライバは以下のとおりです。

fn-bea:execute-sql() 関数で使用するデータソースには、非 XA ドライバを使用してください。この関数は、データソースへの読み込み専用アクセスをサポートしています

警告 : データベースへの接続に非 XA JDBC ドライバ クラスを指定する以外に、グローバル トランザクションと 2 フェーズ コミットを無効にしている必要があります (WebLogic Server Console で JDBC データ ソースを使用する場合、デフォルトではグローバル トランザクションが有効になっています)。データ ソースへのこれらの指定は、WebLogic Server Administration Console で行うことができます。『WebLogic Server Administration Console オンライン ヘルプ』の「JDBC データ ソースの作成」を参照してください

Oracle Service Bus でのデータベースと JDBC ドライバのサポートについては、Oracle Service Bus 10g R3 でサポート対象のコンフィグレーションの「サポート対象のデータベース コンフィグレーション」を参照してください。

前のコード リストに示したコア セット以外のデータベースもサポートされています。ただし、上記のコア データベースでは、非コア データベースの場合よりも、XQuery エンジンが適切にデータ型を認識し、XQuery タイプにマップします。データを取得する際に、コア データベースの独自の JDBC 拡張が使用される場合もあります。非コア データベースでは、XQuery エンジンは、JDBC ドライバが提供する標準タイプのコード、および標準の JDBC ResultSet のアクセス メソッドに完全に依存します。

プロキシ サービスを設計する際に、XQuery をリソースとして入力するのではなく、アクション定義の一部としてインラインで入力することができます。メッセージ フローで If...Then... アクションの条件にインライン XQuery を使用することもできます。インライン XQuery エディタの使用については、「変数の構造のマッピングの作成」を参照してください。

 


メッセージ コンテキストについて

メッセージ コンテキストは、Oracle Service Bus を介してメッセージがルーティングされるときに、メッセージ コンテキストとメッセージに関する情報を保持する一連の変数です。headerbody、および attachments の各変数 (XQuery 文では、$header$body、および $attachments) は、Oracle Service Bus を介して流れるメッセージを表します。メッセージの標準書式は SOAP です。サービス タイプが SOAP でなくても、メッセージは Oracle Service Bus のメッセージ コンテキスト内で SOAP として表示されます。

メッセージ コンテキストのコンポーネント

メッセージ コンテキストでは、$header に SOAP Header 要素が格納され、$body に SOAP Body 要素が格納されます。Header 要素と Body 要素は、プロキシ サービスのサービス タイプに応じて SOAP 1.1 または SOAP 1.2 のネームスペースで修飾されます。また、メッセージ コンテキストでは、$attachments に attachments と呼ばれるラッパー要素が含まれ、attachment ごとに 1 つの attachment 子要素を持ちます。attachment 要素には、body 要素と実際の添付ファイルが含まれます。

プロキシ サービスでメッセージを受信すると、メッセージのコンテンツを使用して header 変数、body 変数、および attachments 変数が初期化されます。SOAP サービスの場合、受信した SOAP メッセージのエンベロープから Header 要素および Body 要素が直接取得され、それぞれ $header および $body に割り当てられます。非 SOAP サービスの場合、通常はメッセージのコンテンツ全体が Body 要素 (SOAP 1.1 ネームスペースで修飾) でラップされて $body に割り当てられ、空の Header 要素 (SOAP 1.1 ネームスペースで修飾) が $header に割り当てられます。

バイナリ メッセージと MFL メッセージは別の方法で初期化されます。MFL メッセージの場合、$body に割り当てられる Body 要素には、MFL と同等の XML ドキュメントが挿入されます。バイナリ メッセージの場合、メッセージ データは内部的に格納され、$body に割り当てられる Body 要素には参照 XML が挿入されます。参照 XML は <binary-content ref="..."/> のような形式になります。"..." には、プロキシ サービスによって割り当てられるユニークな識別子が入ります。

メッセージ コンテキストは、XML スキーマによって定義されます。プロキシ サービスを定義するメッセージ フローのコンテキスト変数を操作するには、XQuery 式を使用する必要があります。

Oracle Service Bus で事前定義されているコンテキスト変数は、以下のように分類されます。

事前定義されたコンテキスト変数の詳細については、「事前定義されたコンテキスト変数」を参照してください。

$body には、メッセージのペイロード変数が含まれます。Oracle Service Bus からメッセージをディスパッチするときに、送信メッセージに含める変数を決定できます。この決定は、対象のエンドポイントが SOAP メッセージを受信するか非 SOAP メッセージを受信するかによって異なります。

非 SOAP サービスの場合、$body の Body 要素に binary-content 要素が格納されると、対象サービスのタイプに関係なく、内部的に格納された参照先コンテンツがそのまま送信されます。

詳細については、「メッセージ コンテキスト」を参照してください。

メッセージ コンテキスト変数の型は、メッセージ コンテキスト スキーマ (MessageContext.xsd) によって定義されます。Oracle XQuery Mapper でメッセージ コンテキスト変数を操作する場合は、JAR ファイル (ORACLE_HOME/osb_10.3/lib/sb-schemas.jar) に用意された MessageContext.xsd と、次の場所にある転送固有のスキーマを参照する必要があります。

ORACLE_HOME/osb_10.3/lib/transports/

ここで、ORACLE_HOME は Oracle Service Bus をインストールしたディレクトリを表す。

メッセージ コンテキスト スキーマおよび転送固有スキーマの詳細については、「メッセージ コンテキスト スキーマ」を参照してください。

メッセージ コンテキストを表示および変更するためのガイドライン

メッセージ コンテキストを検査または変更するときには、以下のガイドラインを考慮してください。

inbound から outbound への JMS プロパティのコピー

AquaLogic Service Bus では、プロキシ サービスと呼び出されるビジネス サービスのインタフェースが異なることが前提になっています。そのため、inbound 変数から outbound 変数への情報 (転送ヘッダや JMS プロパティなど) の伝播は行われません。

プロキシ サービスの要求メッセージと応答メッセージの転送ヘッダは $inbound に含まれ、呼び出されるビジネス サービスの要求と応答の転送ヘッダは $outbound に含まれます。

たとえば、一方向メッセージ (応答のない呼び出し) で、ユーザ定義の JMS プロパティを着信メッセージから発信メッセージにコピーする必要がある場合、次の XQuery 式を使用できます。

転送ヘッダ アクションを使用して、次のように設定します。

$inbound/ctx:transport/ctx:request/tp:headers/tp:user-header 

これを

./ctx:transport/ctx:request/tp:headers 

の最初の子として設定します。

転送ヘッダ アクションをコンフィグレーションする方法については、以下を参照してください。

 


変数の構造での作業

この節の内容は以下のとおりです。

インライン XQuery 式エディタの使用

Oracle Service Bus では、Oracle XQuery Mapper などの外部ツールで作成された XQuery をインポートできます。これらの XQuery は、プロキシ サービスのメッセージ フローのどの場所でも使用できます。XQuery を使用するには、XQuery リソースの入力をインライン XQuery にバインドし、XQuery リソースの出力をアクションにバインドします。このアクションは、出力の結果を入力として使用する割り当て、置換、挿入などのアクションです。

ただし、XQuery をリソースとして入力するのではなく、アクションの定義の一部としてインラインで入力することができます。If...Then... アクションの条件にインライン XQuery を使用することもできます。

インライン XQuery 式エディタは、以下で構成される簡単な XQuery を入力するときに使用します。

注意 : より複雑な XQuery については、XQuery に慣れていない場合は特に、XQuery Mapper を使用することをお勧めします。

インライン XQueries は、次のような場合に使用すると効率的です。

注意 : インライン XQuery 式エディタを使用して、変数の構造を作成することもできます。詳細については、「変数の構造の使用」を参照してください。

インライン XQuery

Oracle Service Bus では、Oracle XQuery Mapper などの外部ツールで作成された XQuery をインポートできます。これらの XQuery は、プロキシ サービスのメッセージ フローのどの場所でも使用できます。XQuery を使用するには、XQuery リソースの入力をインライン XQuery にバインドし、XQuery リソースの出力をアクションにバインドします。このアクションは、出力の結果をアクション入力として使用する割り当て、置換、挿入などのアクションです。ただし、XQuery·をリソースとして入力するのではなく、アクションの定義の一部としてインラインで入力することができます。If...Then... アクションの条件にインライン XQuery を使用することもできます。

インライン XQuery エディタとインライン XPath エディタでは、変数の構造を型または要素にマップし、その構造のグラフィック表現からドラッグ アンド ドロップ操作によってパス式を作成することにより、変数の構造を宣言できます。また、パス式を手動で入力することもできます。

この機能は、すべてのユーザ定義変数と $inbound$outbound、および $fault に対して直接使用できます。ただし、この機能を使用して $attachments の XML 添付ファイル、$header のヘッダ、または $body のドキュメントと RPC パラメータに直接アクセスすることはできません。例外として、WSDL プロキシ サービスによって受信された要求メッセージの $body のドキュメントとパラメータには直接アクセスできます。

変数の構造の作成方法の詳細については、「変数の構造のマッピングの作成」を参照してください。

XQuery エンジンのサポート、および Oracle Data Service Integrator 関数と演算子の関係の詳細については、「XQuery の実装」を参照してください。

インライン XQuery 式エディタの用途

通常、インライン XQuery 式エディタは、以下で構成される簡単な XQuery を入力するときに使用します。

注意 : 複雑な XQuery には、ドラッグ アンド ドロップ機能を備えた Oracle XQuery Mapper を使用することをお勧めします。『XQuery Mapper を使用したデータの変換』の「XQuery Mapper を使用したデータの変換を参照してください。

インライン XQuery の適切な使用例は次のとおりです。

インライン XQuery 式エディタを使用して、変数の構造を作成することもできます。詳細については、「変数の構造の使用」を参照してください。

変数の構造の使用

インライン XQuery 式エディタを使用すると、変数の構造を作成することができます。これにより、設計の目的で特定の変数の構造を定義できます。たとえば、XPath 変数の XML スキーマを表示するよりも、コンソールで XPath 変数を参照する方が簡単です。

注意 : ランタイムを作動させるために変数の構造を作成する必要はありません。変数の構造によって、変数の構造や変数パスが定義されますが、変数は作成されません。変数は、ステージでの割り当てアクションの対象として実行時に作成されます。

一般的なプログラミング言語では、変数のスコープは静的です。変数の名前と型は明示的に宣言されます。静的なスコープ内の任意の場所から変数にアクセスできます。

Oracle Service Bus にはいくつかの事前定義された変数が存在しますが、変数を動的に作成し、割り当てアクションまたは for ループ内のループ変数を使用して変数に値を割り当てることもできます。変数に値を割り当てると、プロキシ サービスのメッセージ フローの任意の場所から変数にアクセスできるようになります。変数の型は宣言されませんが、原則として、任意の時点で変数に格納されている基礎になる値の型が変数の型になります。

注意 : for ループの変数のスコープは制限されており、ステージ外からはアクセスできません。

インライン XQuery 式エディタを使用すると、XQuery には 0 以上の入力と 1 つの出力が含まれます。式エディタ自体に入力と出力の構造を表示できるため、インライン XQuery を作成するときに、XML スキーマまたは WSDL リソースを開いて構造を確認する必要はありません。構造が視覚的に表示されるため、作成中の XQuery に述部を指定せずに、child 軸に沿って単純な変数パスをドラッグ アンド ドロップすることができます。

変数の構造のマッピングでは、各エントリはラベルを持ち、変数または変数パスを 1 つまたは複数の構造にマップします。これらのマッピングのスコープはステージまたはルート ノードです。変数は静的に型指定されないので、1 つの変数がステージまたはルート ノードのさまざまな位置 (または同じ位置) で複数の異なる構造を持つことができます。つまり、1 つの変数または変数パスを複数の構造にマップし、それぞれに異なるラベルを使用することができます。構造を表示するには、ドロップダウン リストで対応するラベルを選択します。

注意 : インライン XPath 式エディタでも変数の構造のマッピングを作成できます。ただし、変数または変数パスは構造にマップされますが、構造から選択したときに生成される XPath は、変数を基準にした相対 XPath です。./ctx:attachment/ctx:body は、相対 XPath の一例です。

変数の構造のマッピングの作成

以下の節では、さまざまなタイプの変数の構造のマッピングを作成する方法について説明します。

サンプル WSDL

このサンプル WSDL は、この節のほとんどの例で使用します。この WSDL をリソースとしてコンフィグレーションに保存してください。詳細については、「例で必要なリソースの作成」を参照してください。

コード リスト 3-17 サンプル WSDL
<definitions 
    name="samplewsdl"
    targetNamespace="http://example.org"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:s0="http://www.oracle.com"
    xmlns:s1="http://example.org"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types>
  <xs:schema
    attributeFormDefault="unqualified"
    elementFormDefault="qualified"
    targetNamespace="http://www.oracle.com"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="PO" type="s0:POType"/>
    <xs:complexType name="POType">
      <xs:all>
        <xs:element name="id" type="xs:string"/>
        <xs:element name="name" type="xs:string"/>
      </xs:all>
    </xs:complexType>
    <xs:element name="Invoice" type="s0:InvoiceType"/>
    <xs:complexType name="InvoiceType">
      <xs:all>
        <xs:element name="id" type="xs:string"/>
        <xs:element name="name" type="xs:string"/>
      </xs:all>
    </xs:complexType>
</xs:schema>
</types>
<message name="POTypeMsg">
    <part name="PO" type="s0:POType"/>
</message>
<message name="InvoiceTypeMsg">
    <part name="InvReturn" type="s0:InvoiceType"/>
</message>

<portType name="POPortType">
    <operation name="GetInvoiceType">
      <input message="s1:POTypeMsg"/>
      <output message="s1:InvoiceTypeMsg"/>
    </operation>
</portType>
<binding name="POBinding" type="s1:POPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetInvoiceType">
      <soap:operation soapAction="http://example.com/GetInvoiceType"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
    </output>
  </operation>
</binding>
</definitions>

例で必要なリソースの作成

この後の例を利用するには、サンプル WSDL をリソースとしてコンフィグレーションに保存し、サンプル WSDL を使用するサンプルのビジネス サービスとプロキシ サービスを作成します。

以下の手順に従って、Oracle Service Bus Console でタスクを実行します。

WSDL のリソースとしての保存
  1. Oracle Service Bus Console の左側のナビゲーション ペインで、[Change Center] の下にある [作成] をクリックして、現在のコンフィグレーションに変更を加えるための新しいセッションを作成します。
  2. 左側のナビゲーション ペインで、[プロジェクト エクスプローラ] をクリックします。
  3. [プロジェクト ビュー] ページで、WSDL の追加先となるプロジェクトをクリックします。
  4. [プロジェクト ビュー] ページの [リソースの作成] フィールドで、[インタフェース] の下にある [WSDL] を選択します。
  5. [新しい WSDL リソースの作成] ページの [リソース名] フィールドに「SampleWSDL」と入力します。このフィールドは必須です。
  6. サンプル WSDL のテキストをコピーして [WSDL] フィールドに貼り付けます。
  7. 注意 : このフィールドは必須です。
  8. [保存] をクリックします。新しい WSDL SampleWSDL がリソースのリストに追加され、現在のセッションで保存されます。次に、この WSDL を使用するプロキシ サービスを作成する必要があります。「サンプル WSDL を使用するプロキシ サービスの作成」を参照してください。
サンプル WSDL を使用するプロキシ サービスの作成
  1. 左側のナビゲーション ペインで、[プロジェクト エクスプローラ] をクリックします。
  2. [プロジェクト ビュー] ページで、プロキシ サービスの追加先となるプロジェクトを選択します。
  3. [プロジェクト ビュー] ページの [リソースの作成] フィールドで、[サービス] の下にある [プロキシ サービス] を選択します。
  4. [プロキシ サービスの編集 - 全般的なコンフィグレーション] ページの [サービス名] フィールドに、「ProxywithSampleWSDL」と入力します。このフィールドは必須です。
  5. [サービスの種類] フィールドでは、次のように、サービスで交換されるメッセージのタイプとパッケージ化を定義します。
    1. [新しいサービスの作成] の下にある [WSDL Web サービス] を選択します。
    2. [参照] をクリックします。[WSDL ブラウザ] が表示されます。
    3. [SampleWSDL] を選択し、[WSDL 定義の選択] で [POBinding] を選択します。
    4. [送信] をクリックします。
  6. [全般的なコンフィグレーション] ページの他のすべてのフィールドをデフォルト値のままにし、[次へ] をクリックします。
  7. [転送コンフィグレーション] ページのすべてのフィールドをデフォルト値のままにし、[次へ] をクリックします。
  8. [操作選択コンフィグレーション] ページで、[選択アルゴリズム] フィールドに [SOAP 本体の種類] が選択されていることを確認し、[次へ] をクリックします。
  9. このプロキシ サービスについてこれまでに入力したコンフィグレーション データを確認し、[保存] をクリックします。新しいプロキシ サービス ProxywithSampleWSDL がリソースのリストに追加され、現在のセッションで保存されます。このプロキシ サービスのメッセージ フローを構築するには、「サンプル プロキシ サービスのメッセージ フローの構築」を参照してください。
サンプル プロキシ サービスのメッセージ フローの構築
  1. [プロジェクト ビュー] ページの [アクション] カラムで、ProxywithSampleWSDL プロキシ サービスの [メッセージ フローの編集] アイコンをクリックします。
  2. [メッセージ フローの編集] ページで、[ProxywithSampleWSDL] アイコンをクリックし、[パイプライン ペアの追加] をクリックしますPipelinePairNode1 が表示されます。ここには、要求パイプラインと応答パイプラインが含まれています。
  3. [要求パイプライン] アイコンをクリックし、[ステージの追加] をクリックします。ステージ [Stage1] が表示されます。
  4. [保存] をクリックします。ProxywithSampleWSDL プロキシ サービスの基本的なメッセージ フローが作成されました。
サンプル WSDL を使用するビジネス サービスの作成
  1. 左側のナビゲーション ペインで、[プロジェクト エクスプローラ] をクリックします。[プロジェクト ビュー] ページが表示されます。
  2. ビジネス サービスを追加するプロジェクトを選択します。
  3. [プロジェクト ビュー] ページの [リソースの作成] フィールドで、[サービス] の下にある [ビジネス サービス] を選択します。[ビジネス サービスの編集 - 全般的なコンフィグレーション] ページが表示されます。
  4. [サービス名] フィールドに「BusinesswithSampleWSDL」と入力します。このフィールドは必須です。
  5. [サービスの種類] フィールドでは、次のように、サービスで交換されるメッセージのタイプとパッケージ化を定義します。
    1. [新しいサービスの作成] の下にある [WSDL Web サービス] を選択します。
    2. [参照] をクリックします。[WSDL ブラウザ] が表示されます。
    3. [SampleWSDL] を選択し、[WSDL 定義の選択] で [POBinding] を選択します。
    4. [送信] をクリックします。
  6. [全般的なコンフィグレーション] ページの他のすべてのフィールドをデフォルト値のままにし、[次へ] をクリックします。
  7. [転送コンフィグレーション] ページの [エンドポイント URI] フィールドに、エンドポイントの URI を入力します。
    [追加] をクリックし、[次へ] をクリックします。
  8. [SOAP バインディング コンフィグレーション] ページのすべてのフィールドにデフォルト値を使用します。
    [次へ] をクリックします。
  9. このビジネス サービスについてこれまでに入力したコンフィグレーション データを確認し、[保存] をクリックします。新しいビジネス サービス BusinesswithSampleWSDL がリソースのリストに追加され、現在のセッションで保存されます。
  10. 左側のナビゲーション ペインで、[Change Center] の下にある [アクティブ化] をクリックします。セッションが終了し、コンフィグレーションがランタイムにデプロイされます。これで、例を使用する準備ができました。「例 1 : 事前定義された変数の構造の選択」に進みます。

例 1 : 事前定義された変数の構造の選択

この例では、プロキシ サービス ProxyWithSampleWSDL を使用して事前定義された変数の構造を選択します。このサービスのタイプは、SampleWSDL のバインディング POBinding を使用する WSDL Web サービスです

プロキシ サービスのメッセージ フローが、処理するメッセージの構造を認識している必要があります。このために、Oracle Service Bus では事前定義された構造が自動的に提供されます。この構造は、インタフェースのすべてのメッセージで、プロキシ サービスの WSDL での定義に従って、body 変数を SOAP 本体の構造にマップします。この事前定義された構造のマッピングのラベルは body です。

注意 : この事前定義された構造は、型付きインタフェースを備えたメッセージング サービスのためにもサポートされています。

事前定義された変数の構造の選択

[XQuery 式エディタ] ページの [変数の構造] パネルで、組み込み構造のドロップダウン リストから [body] を選択します。

変数の構造 body は、図 3-4 のように表示されます。

図  3-4 変数の構造 - body

変数の構造 - body

例 2 : 変数を型にマップする変数の構造の作成

プロキシ サービス ProxyWithSampleWSDL が、ビジネス サービス BusinessWithSampleWSDL へのサービス コールアウトを呼び出すとします。このビジネス サービスも、サービスのタイプは SampleWSDL のバインディング POBinding を使用する WSDL Web サービスです。操作 GetInvoiceType が呼び出されます。

この例では、メッセージ フローが、処理する応答パラメータの構造を認識する必要があります。このためには、応答パラメータ変数を型 InvoiceType にマップする新しい変数の構造を作成します。

変数を型にマップするには

  1. [変数の構造] パネルで [新しい構造の追加] をクリックします。追加フィールドが図 3-5 のように表示されます。
  2. 図  3-5 変数の構造 - 新しい構造の追加


    変数の構造 - 新しい構造の追加

  3. [XML の種類] を選択します。
  4. [構造ラベル] フィールドに、作成する変数の構造の表示名として「InvoiceType」と入力します。この表示名を使用すると、実行時には影響を及ぼさず設計時に構造を認識できるように、構造に意味のある名前を付けることができます。
  5. [構造パス] フィールドに、実行時の変数のパスとして「$InvoiceType」と入力します。
  6. [InvoiceType] のタイプを選択するには、次のようにします。
    1. [種類] フィールドで、該当するラジオ ボタンを選択してから、ドロップダウン リストから [WSDL の種類] を選択します
    2. [参照] をクリックします。[WSDL ブラウザ] が表示されます。
    3. [WSDL ブラウザ] で [SampleWSDL] を選択してから、[WSDL 定義の選択] ペインの [種類] で [InvoiceType] を選択します。
    4. [送信] をクリックします。選択した [WSDL の種類] の下に [InvoiceType] が表示されます。
  7. [追加] をクリックします。新しい変数の構造 [InvoiceType] が変数の構造のドロップダウン リストの [XML の種類] の下に追加されます。
  8. 変数の構造 InvoiceType は、図 3-6 のように表示されます。

    図  3-6 変数の構造 - InvoiceType


    変数の構造 - InvoiceType

例 3 : 変数を要素にマップする変数の構造の作成

一時変数には、SampleWSDL WSDL で記述された要素 Invoice が含まれているとします。この例では、ProxyWithSampleWSDL メッセージ フローは、この変数にアクセスする必要があります。このためには、変数を要素 Invoice にマップする新しい変数の構造を作成します。

変数を要素にマップするには

  1. [変数の構造] パネルで [新しい構造の追加] をクリックします。
  2. 必ず [XML の種類] を選択します。
  3. [構造ラベル] フィールドに、作成する変数の名前として、表示されたときに意味がわかるように「Invoice」と入力します。
  4. [構造パス] フィールドに、実行時の変数の構造のパスとして「$Invoice」と入力します。
  5. 要素 [Invoice] を選択するには、次のようにします。
    1. [種類] フィールドで、該当するラジオ ボタンを選択していることを確認します。ドロップダウン リストから [WSDL 要素] を選択します
    2. [参照] をクリックします。
    3. [WSDL ブラウザ] で [SampleWSDL] を選択してから、[WSDL 定義の選択] ペインの [要素] で [Invoice] を選択します。
    4. [送信] をクリックします。選択した [WSDL 要素] の下に [Invoice] が表示されます。
  6. [追加] をクリックします。新しい変数の構造 [Invoice] が変数の構造のドロップダウン リストの [XML の種類] の下に追加されます。
  7. 変数の構造 Invoice は、図 3-7 のように表示されます。

    図  3-7 変数の構造 - Invoice


    変数の構造 - Invoice

例 4 : 変数を子要素にマップする変数の構造の作成

プロキシ サービス ProxyWithSampleWSDL は、ドキュメント スタイルが任意の SOAP であるビジネス サービスにルーティングします。このビジネス サービスは、SOAP 本体の発注書を返します。この例では、ProxyWithSampleWSDL プロキシ サービスのメッセージ フローが、その応答を処理する必要があります。このためには、body 変数を PO 要素にマップする新しい構造を作成し、PO 要素を変数の子要素として指定します。body 変数には SOAP Body 要素が格納され、PO 要素は Body 要素の子であるため、子要素として指定する必要があります

変数を子要素にマップするには

  1. [変数の構造] パネルで [新しい構造の追加] をクリックします。
  2. 必ず [XML の種類] を選択します。
  3. [構造ラベル] フィールドに、作成する変数の構造の名前として、表示されたときに意味がわかるように「body to PO」と入力します。
  4. [構造パス] フィールドに、実行時の変数の構造のパスとして「$body」と入力します。
  5. PO 要素を選択するには、次の手順に従います。
    1. [種類] フィールドで、該当するラジオ ボタンを選択していることを確認し、ドロップダウン リストから [WSDL 要素] を選択します
    2. [参照] をクリックします。
    3. [WSDL ブラウザ] で [SampleWSDL] を選択してから、[WSDL 定義の選択] ペインの [要素] の下の [PO] を選択します。
    4. [送信] をクリックします。
  6. PO 要素を body to PO 変数の構造の子として設定するために、[子として設定] チェックボックスを選択します
  7. [追加] をクリックします。新しい変数の構造 body to PO が変数の構造のドロップダウン リストの [XML の種類] の下に追加されます。
  8. 変数の構造 body to PO は、図 3-8 のように表示されます。

    図  3-8 変数の構造 - body to PO


    変数の構造 - body to PO

例 5 : 変数をビジネス サービスにマップする変数の構造の作成

プロキシ サービス ProxyWithSampleWSDL は、ビジネス サービス BusinessWithSampleWSDL にメッセージをルーティングします。このビジネス サービスも、サービスのタイプは SampleWSDL のバインディング POBinding を使用する WSDL Web サービスです。この例では、メッセージ フローが応答を処理する必要があります。このためには、body 変数を BusinessWithSampleWSDL ビジネス サービスにマップする新しい構造を定義します。これにより、サービスの WSDL インタフェースで、すべてのメッセージの SOAP 本体に body 変数がマップされます。

注意 : このマッピングは、型付きインタフェースを備えたメッセージング サービスのためにもサポートされています。

変数をビジネス サービスにマップするには

  1. [変数の構造] パネルで [新しい構造の追加] をクリックします。
  2. [サービス インタフェース] を選択します。
  3. [構造ラベル] フィールドに、変数の構造の名前として、表示されたときに意味がわかるように「BusinessService」と入力します。
  4. [構造パス] フィールドには、デフォルトとしてすでに [$body] が設定されています。これは、実行時の変数の構造のパスになります。
  5. このビジネス サービスを選択するには、以下の操作を実行します。
    1. [サービス] フィールドで [参照] をクリックします。[サービス ブラウザ] が表示されます。
    2. [サービス ブラウザ] で BusinessWithSampleWSDL ビジネス サービスを選択し、[送信] をクリックします。ビジネス サービスが [サービス] フィールドの下に表示されます。
    3. [操作] フィールドで [すべて] を選択します。
  6. [追加] をクリックします。新しい変数の構造 BusinessService が変数の構造のドロップダウン リストの [サービス インタフェース] の下に追加されます。
  7. 変数の構造 BusinessService は、図 3-9 のように表示されます。

    図 3-9 変数の構造 - Business Service


    変数の構造 - Business Service

例 6 : 子要素と子要素をマップする変数の構造の作成

ProxyWithSampleWSDL プロキシ サービスが単一の添付ファイルを受信するように、SampleWSDL を変更します。添付ファイルは発注書です。この例では、プロキシ サービスのメッセージ フローが発注書を処理する必要があります。このためには、$attachmentsbody 要素を、子要素として指定されている PO 要素にマップする新しい構造を定義します。body 要素は、以下の形式の変数パスとして指定されます。

$attachments/ctx:attachment/ctx:body 

事前定義された attachments 構造の body 要素を選択してコピーし、新しいマッピング定義でマップされる変数パスとして貼り付けます。

子要素と子要素をマップするには

  1. [変数の構造] パネルで、組み込み構造のドロップダウン リストから [attachments] を選択します。
  2. 変数の構造 attachments は、図 3-10 のように表示されます。

    図  3-10 変数の構造 - attachments


    変数の構造 - attachments

  3. attachments 構造で body 子要素を選択します。ページの右側にある [プロパティ インスペクタ] に body 要素の変数パスが表示されます。
  4. $attachments/ctx:attachment/ctx:body
  5. body 要素の変数パスをコピーします。
  6. [変数の構造] パネルで [新しい構造の追加] をクリックします。
  7. [XML の種類] を選択します。
  8. [構造ラベル] フィールドに、変数の構造の名前として、表示されたときに意味がわかるように「PO attachment」と入力します。
  9. [構造パス] フィールドに、body 要素の変数パスを貼り付けます。
  10. $attachments/ctx:attachment/ctx:body

    これは、実行時の変数の構造のパスになります。

  11. PO 要素を選択するには、次の手順に従います。
    1. [種類] フィールドで、該当するラジオ ボタンを選択していることを確認し、[WSDL 要素] を選択します。
    2. [参照] をクリックします。
    3. [WSDL ブラウザ] で [SampleWSDL] を選択してから、[WSDL 定義の選択] ペインの [要素] の下の [PO] を選択します。
    4. [送信] をクリックします。
  12. body 要素の子として PO 要素を設定するために、[子として設定] チェックボックスを選択します。
  13. [追加] をクリックします。新しい変数の構造 PO attachment が変数の構造のドロップダウン リストの [XML の種類] の下に追加されます。
  14. 複数の添付ファイルを使用する場合は、この構造化変数のフィールドを XQuery で使用するときに、インデックスを参照に追加します。たとえば、PO フィールドを XQuery フィールドにドラッグして PO を 2 番目の添付にする場合は、挿入した値を変更します。
  15. $attachments/ctx:attachment/ctx:body/oracle:PO/oracle:id

    しかし、PO は 2 つ目の添付ファイルであるため、この値を次のように変更します。

    $attachments/ctx:attachment[2]/ctx:body/oracle:PO/oracle:id

 


サービスの品質

以下の節では、Oracle Service Bus メッセージングのサービス品質機能について説明します。

配信の保証

Oracle Service Bus は、信頼性の高いメッセージ機能を備えています。メッセージがルート ノードから別のサービスにルーティングされるときに、デフォルトのサービスの品質 (QoS) は、プロキシ サービスの転送が JMS/XA として定義されている場合は「必ず 1 回」になり、それ以外の場合は「ベスト エフォート」QoS がサポートされます

サービスの品質は、$outbound コンテキスト変数の qualityOfService 要素で設定されます。

Oracle Service Bus に用意されている配信の保証のタイプを表 3-9 に示します。

表 3-9 配信の保証のタイプ
配信の信頼性
説明
exactly once
「必ず 1 回」の信頼性では、発信メッセージの送信が開始されるまで終了エラーが発生しないことを前提として、メッセージが着信から発信に 1 回だけ配信される。「必ず 1 回」は、信頼性が最適化されることを意味する
「必ず 1 回」の配信の信頼性は提案であり、命令ではない。「必ず 1 回」を指定すると、可能な場合に「必ず 1 回」の信頼性が提供される。「必ず 1 回」が不可能な場合は、「少なくとも 1 回」の配信セマンティクスが試行され、これも不可能な場合は「ベスト エフォート」の配信が実行される
以下の着信転送では、ルート ノード アクションの qualityOfService 要素のデフォルト値は exactly-once になる。
  • 電子メール
  • FTP
  • ファイル
  • JMS/XA
  • SFTP
  • トランザクション対応の Tuxedo

注意 : QoS が exactly once の場合は、発信転送を再試行しない。

at least once
「少なくとも 1 回」のセマンティクスは、発信メッセージの送信が開始されるまで終了エラーが発生しないことを前提として、メッセージが着信から発信に少なくとも 1 回は配信されることを意味する。対象サービスが転送レベルのエラーと共に応答を返した場合でも、配信は成功と見なされる。ただし、タイムアウト、接続エラー、または通信リンクの中断が発生した場合は成功とは見なされない。フェイルオーバ URL が指定されている場合は、少なくとも 1 つの URL について「少なくとも 1 回」のセマンティクスが提供される
「必ず 1 回」が不可能であるが、qualityOfService 要素が exactly-once の場合は、「少なくとも 1 回」の送信が試行される
best effort
「ベスト エフォート」とは、信頼性のあるメッセージングが存在せず、重複するメッセージが除去されないが、パフォーマンスは最適化されることを意味するqualityOfService 要素が best effort の場合に実行される。「必ず 1 回」および「少なくとも 1 回」の送信が不可能であるが、qualityOfService 要素が exactly-once の場合にも、「ベスト エフォート」送信が実行される
以下の着信転送の場合、ルート ノードの qualityOfService 要素のデフォルト値は best-effort になる。
  • HTTP
  • JMS/非 XA
  • トランザクション非対応の Tuxedo
以下の場合、qualityOfService 要素のデフォルト値は常に best-effort になる。
  • サービス コールアウト アクション - 常に best-effort であるが、必要に応じて変更可能
  • パブリッシュ アクション - デフォルトは best effort、変更可能

注意 : パブリッシュ アクションで qualityOfService 要素の値が best-effort の場合、すべてのエラーが無視されます。ただし、ルート ノード アクションまたはサービス コールアウト アクションで qualityOfService 要素の値が best-effort の場合は、すべてのエラーで例外が発生します。

他の転送のサービスの品質の詳細については、「Oracle Service Bus の転送」にある転送に関するドキュメントを参照してください。

デフォルト要素属性のオーバーライド

デフォルトの「必ず 1 回」サービスの品質属性をオーバーライドするには、発信メッセージのコンテキスト変数 ($outbound) で qualityOfService を設定する必要があります。詳細については、「メッセージ コンテキスト スキーマ」を参照してください。

次のアクションのデフォルトの qualityOfService 要素属性をオーバーライドできます。

qualityOfService 要素属性をオーバーライドするには、ルート オプション アクションを使用してルーティングまたはパブリッシュし、サービス コールアウト アクションのチェックボックスも選択する必要があります。「メッセージ コンテキスト スキーマ」を参照してください。

配信の保証のルール

プロキシ サービスがメッセージをパブリッシュするか、要求をビジネス サービスにルーティングするときは、次の条件に応じて配信の保証がサポートされます。

ただし、着信プロキシ サービスがローカル転送で、呼び出し元が別のプロキシ サービスである場合、呼び出し元のプロキシ サービスの着信転送が配信の保証を行います。呼び出されたプロキシ サービスの転送がローカル転送の場合、呼び出し元のプロキシ サービスが最適化されて、直接呼び出しになるためです。転送プロトコルの詳細については、『Oracle Service Bus Console の使い方』の「プロキシ サービス」および「ビジネス サービスを参照してください。

注意 : プロキシ サービスからの応答には配信の保証はありません。

配信の保証に適用されるルールを表 3-10 に示します。

表 3-10 配信の保証のルール
提供される配信の保証
ルール
exactly once
プロキシ サービスの着信転送がトランザクションに対応し、発信 JMS/XA 転送への qualityOfService 要素の値が exactly-once である。
at least once
プロキシ サービスの着信転送がファイル、FTP、または電子メールで、qualityOfService 要素の値が exactly-once である。
At least once
プロキシ サービスの着信転送がトランザクションに対応し、トランザクション非対応の発信転送への qualityOfService 要素の値 (該当する場合) が exactly once である。
配信の保証なし
その他の場合 (すべての応答処理を含む)。

注意 : JMS により配信の保証として「少なくとも 1 回」および「必ず 1 回」をサポートするには、JMS トランザクションを利用し、サーバがクラッシュした場合、または返信アクションや再開アクションのエラー ハンドラで処理できないエラーが発生した場合にメッセージを再配信できるように、JMS キューの再試行回数と再試行間隔をコンフィグレーションする必要があります。ファイル、FTP、および電子メール転送でも、内部では JMS/XA キューが使用されます。JMS/XA 転送を使用したプロキシ サービスのデフォルトの再試行回数は 1 です。Oracle Service Bus で作成されるデフォルトの JMS キューのリストについては、『Oracle Service Bus デプロイメント ガイド』を参照してください。

配信の保証のその他のルールは次のとおりです。

スレッディング モデル

Oracle Service Bus のスレッディング モデルは次のように作動します。

注意 : 要求フローまたは応答フローのパブリッシュ アクションでは、応答は常に破棄されます。これは、パブリッシュ アクションは本質的に一方向のメッセージ送信であるためです

プロキシ サービスの分割

以下の場合に、プロキシ サービスの分割を検討してください。

発信メッセージの再試行

JMS を使用してメッセージの着信の再試行をコンフィグレーションするだけでなく、発信の再試行およびロード バランシングもコンフィグレーションできます。ロード バランシング、フェイルオーバ、および再試行の組み合わせによって、パフォーマンスと高可用性を実現できます。各メッセージのフェイルオーバ URL として指定した URL のリストは、ロード バランシング アルゴリズムに基づいて自動的に並べ替えられ、フェイルオーバのシーケンスが形成されます。再試行回数が N の場合、シーケンス全体が N 回再試行されてから終了します。システムは指定された再試行間隔の時間だけ待機してから、シーケンスの次のループを開始します。再試行回数が完了してもまだエラーがある場合、ルート ノードのエラー処理パイプラインが呼び出されます。エラー ハンドラ パイプラインの詳細については、『Oracle Service Bus Console の使い方』の「プロキシ サービス」にある「パイプラインへのエラー処理の追加」を参照してください。

注意 : HTTP 転送の場合、Oracle Service Bus では 200 または 202 以外の HTTP ステータスはエラーと見なされるため、再試行する必要があります。このアルゴリズムにより、Oracle Service Bus では、解決することのできない認証エラーなどのエラーを、その URL で一定期間再試行することが可能です。これに対して、Oracle Service Bus で任意のメッセージの送信を再試行するときに別の URL にフェイルオーバする場合は、新しい URL ではエラーにならない可能性があります。
注意 : quality of serviceexactly once の場合、フェイルオーバや再試行は行われません。

 


コンテンツ タイプ、JMS タイプ、およびエンコーディング

Oracle Service Bus では、異種のエンドポイント間での相互運用性を確保するため、コンテンツ タイプ、JMS タイプ、およびエンコーディングをそれぞれ制御できます。

Oracle Service Bus では外部のクライアントまたはサービスに必要な情報が想定されませんが、サービス定義でコンフィグレーション済みの情報が使用されます。発信メッセージのコンテンツ タイプは、サービス タイプとインタフェースから派生します。コンテンツ タイプは、電子メールおよび HTTP プロトコルの一部です。

サービス タイプごとのコンテンツ タイプを以下に示します。

また、JMS タイプにはバイトまたはテキストを指定できます。Oracle Service Bus Console または Workshop for WebLogic 用の Oracle Service Bus プラグインでサービスを定義するときに、使用する JMS タイプをコンフィグレーションします。

サービスを呼び出すプロキシ サービスの発信コンテキスト変数 ($outbound) のコンテンツ タイプ、およびプロキシ サービス応答の着信コンテキスト変数 ($inbound) のコンテンツ タイプはオーバーライドできます。$outbound コンテキスト変数と $inbound コンテキスト変数の詳細については、「inbound 変数と outbound 変数」を参照してください。

すべての発信メッセージのエンコーディングも、サービス定義で明示的にコンフィグレーションします。サービス定義の詳細については、『Oracle Service Bus Console の使い方』の「プロキシ サービス」および「ビジネス サービスを参照してください。

 


抑制パターン

Oracle Service Bus では、メッセージ フローをビジネス サービスに制限できます。このビジネス サービスへのメッセージ フローを制限する技術は、スロットルと呼ばれます。詳細については、『Oracle Service Bus オペレーション ガイド』の「Oracle Service Bus のスロットル」を参照してください。

 


WS-I への準拠

Oracle Service Bus は、実行時環境で SOAP 1.1 サービスへの Web サービス相互運用性 (WS-I) 準拠を提供します。WS-I の基本プロファイルの目的を以下に示します。

WS-I 基本プロファイルは、次の URL で入手できます。

http://www.ws-i.org/Profiles/BasicProfile-1.1.html (英文)

プロキシ サービスまたはビジネス サービスを WSDL に基づいてコンフィグレーションするとき、Oracle Service Bus Console または Workshop for WebLogic 用の Oracle Service Bus プラグインを使用すると、Oracle Service Bus で WS-I 準拠をそれらのサービスに適用するかどうかを指定できます。この方法については、以下を参照してください。

プロキシ サービスの WS-I 準拠をコンフィグレーションすると、そのプロキシ サービスが受信する着信要求メッセージでチェックが実行されます。呼び出されたサービスについて WS-I 準拠をコンフィグレーションすると、その呼び出されたサービスからの応答メッセージを任意のプロキシが受信したときに、チェックが実行されます。デフォルトでは、プロキシ サービスの SOAP クライアントはシステム エラー ハンドラ定義のエラーを受け取るため、このようなエラーに対応するエラー ハンドラを作成することをお勧めします。エラー ハンドラの作成方法の詳細については、以下を参照してください。

プロキシ サービスから送信されるメッセージについては、それが発信要求でも着信応答でも、WS-I 準拠のチェックは明示的には実行されません。これは、ほとんどのメッセージ コンテンツの生成はパイプライン設計者によって行われるためです。ただし、メッセージの Oracle Service Bus によって生成される部分は、サポートされる WS-I 準拠のすべてのチェックを満たします。以下のコンテンツが含まれます。

[WS-I 準拠の適用] チェックボックスは、図 3-11 のように表示されます。

図 3-11 [WS-I 準拠の適用] チェックボックス

[WS-I 準拠の適用] チェックボックス

WS-I 準拠チェック

注意 : WS-I 準拠チェックでは、サービスで呼び出される操作をシステムが認識する必要があります。つまり、プロキシ サービスが受信する要求メッセージでは、コンテキスト変数 $operation は null 以外の値であることが必要です。そのためには、操作選択アルゴリズムが適切にコンフィグレーションされていることが前提になります。呼び出されたサービスから受信する応答メッセージでは、ルート、パブリッシュ、およびサービス コールアウトのアクション コンフィグレーションで操作が指定されている必要があります。

プロキシ サービスまたはビジネス サービスの WS-I 準拠チェックをコンフィグレーションすると、表 3-11 に示すチェックが実行されます。

表 3-11 Oracle Service Bus の WS-I 準拠チェック
チェック
WS-I 基本プロファイルの詳細
説明
3.1.1 SOAP エンベロープ構造
R9980 エンベロープは、SOAP 1.1、第 4 節「SOAP Envelope」に指定された構造に準拠する必要がある (修正対象)。
このチェックは、要求メッセージと応答メッセージに適用される。応答メッセージがチェックされ、メッセージに外部 Envelope タグがない場合、soap:client エラーが生成される。メッセージが Envelope タグだが、別のネームスペースがある場合、3.1.2 SOAP エンベロープ ネームスペースによって処理される。
3.1.2 SOAP エンベロープ ネームスペース
R1015 受信側は、ドキュメント要素が soap: Envelope でないエンベロープを検出した場合にエラーを生成する必要がある。
このチェックは要求メッセージと応答メッセージに適用される。これは、3.1.1 SOAP エンベロープ構造に関連している。要求メッセージのローカル名が Envelope であるが、ネームスペースが SOAP 1.1 でない場合、soap: VersionMismatch エラーが生成される。
3.1.3 SOAP Body のネームスペース修飾
R1014 エンベロープの soap:body 要素の子要素は、ネームスペースで修飾する必要がある。
このチェックは、要求メッセージと応答メッセージに適用される。すべての要求エラー メッセージで soap: Client エラーが生成される。
3.1.4 許可されない構成
R1008 エンベロープは文書型宣言を含んではならない。
このチェックは、要求メッセージと応答メッセージに適用される。すべての要求エラー メッセージで soap: Client エラーが生成される。
3.1.5 SOAP トレーラ
R1011 エンベロープでは、soap:body 要素の後に soap: Envelope の子要素があってはならない。
このチェックは、要求メッセージと応答メッセージに適用される。すべての要求エラー メッセージで soap: Client エラーが生成される。
3.1.9 SOAP 1.1 要素の SOAP 属性
R1032 エンペロープの soap: Envelopesoap:header、および soap:body 要素は、ネームスペース http://schemas.xmlsoap.org/soap/envelope/ の属性を持つことはできない。
このチェックは、要求メッセージと応答メッセージに適用される。任意の要求エラー メッセージで soap:client エラーが生成される。
3.3.2 SOAP Fault の構造
R1000 エンベロープが Fault の場合、soap: Fault 要素は、faultcodefaultstringfaultactor、および detail 以外の要素の子を持つことはできない。
このチェックは、応答メッセージのみに適用される。
3.3.3 SOAP Fault のネームスペース修飾
R1001 エンベロープが Fault の場合、soap: Fault 要素の子要素は修飾されていてはならない。
このチェックは、応答メッセージのみに適用される。
3.4.6 HTTP クライアント エラー ステータス コード
R1113 HTTP 要求メッセージの形式に誤りがある場合、インスタンスは「400 Bad Request」HTTP ステータス コードを使用する必要がある。
R1114 HTTP 要求メッセージの形式に誤りがある場合、インスタンスは「405 Method not Allowed」HTTP ステータス コードを使用する必要がある。
R1125 要求のフォーマットに問題がある応答については、インスタンスは 4xx HTTP ステータス コードを使用する必要がある。
要求のエラーで返されるステータス コードを変更できない場合、プロキシ サービスの応答のみに適用される。
3.4.7 HTTP サーバ エラー ステータス コード
R1126 応答エンベロープが Fault の場合、インスタンスは「500 Internal Server Error」HTTP ステータス コードを返す必要がある。
このチェックは、要求メッセージと応答メッセージに別の方法で適用される。要求メッセージの場合、生成されたエラーには「500 Internal Server Error」HTTP ステータス コードが含まれる。応答メッセージの場合、「500 Internal Server Error」HTTP ステータス コードのないエラー応答が受信されると、エラーが生成される。
4.7.19 応答ラッパー
R2729 rpc-literal バインディングで記述されたエンベロープが応答である場合、対応する wsdl: operation の名前に文字列 Response がサフィックスとして付いた名前のラッパー要素が必要
このチェックは、応答メッセージのみに適用される。Oracle Service Bus では、プロキシ サービスから Fault 以外の応答を生成することはない。
4.7.20 パート アクセサ
R2735 rpc-literal バインディングで記述されたエンベロープでは、ネームスペースにないパラメータと戻り値のパート アクセサ要素を配置する必要がある。
R2755 rpc-literal バインディングで記述されたメッセージのパート アクセサ要素は、対応する wsdl: part 要素の name 属性と同じ値のローカル名を持つ必要がある。
このチェックは、要求メッセージと応答メッセージに適用される。任意の要求エラー メッセージで soap:client エラーが生成される。
4.7.22 必須ヘッダ
R2738 エンベロープは、エンベロープを記述する wsdl: bindingwsdl: operationwsdl: input または wsdl: output に指定された、すべての soapbind: headers を含む必要がある。
このチェックは、要求メッセージと応答メッセージに適用される。任意の要求エラー メッセージで soap:client エラーが生成される。
4.7.25 SOAPAction の記述
R2744 HTTP 要求メッセージは、SOAPAction HTTP ヘッダ フィールドに、soap: operation の soapAction 属性の値と等しい、引用符で囲まれた値を含む必要がある (対応する WSDL 記述にこの値が存在する場合)。
R2745 HTTP 要求メッセージは、SOAPAction HTTP ヘッダ フィールドに、引用符で囲まれた空の文字列値を含む必要がある (対応する WSDL 記述に、soapbind: operation の SOAPAction が存在しない場合、または値が空の文字列で存在する場合)。
このチェックは要求メッセージに適用され、soap:client エラーが返される。

 


SOAP 1.1 と SOAP 1.2 間の変換

Oracle Service Bus は、SOAP 1.1 と SOAP 1.2 をサポートしています。SOAP 1.1 プロキシ サービスで SOAP 1.2 ビジネス サービスを呼び出すことも、その逆の呼び出しを行うこともできます。しかし、SOAP 1.1 と 1.2 に違いがあるため、Oracle Service Bus は一部の状況で 2 つの SOAP 間での自動変換を実行できません。SOAP 1.1 と 1.2 の変換を適切に使用するには、以下のガイダンスを使用してください。


  ページの先頭       前  次