この章では、分割-結合の概要とその作成方法について説明し、さらに静的分割-結合と動的分割-結合のシナリオについても説明します。分割-結合とは、高度な仲介機能であり、1つのリクエスト内の個々のメッセージを同時に処理できるため、サービスのパフォーマンスの向上に役立ちます。
この章の内容は次のとおりです。
分割-結合とは、メッセージのフローと処理を管理するためにService Busで使用できる仲介パターンです。分割-結合を使用すると、標準の順次処理とは対照的に、注文などのサービス・ペイロードを、複数のサービスに同時に送信される個々のメッセージに分割できます。これにより、サービスのパフォーマンスが大幅に向上します。分割-結合では、入力メッセージ・ペイロードをサブメッセージに分け(分割)、それらのサブメッセージを宛先に同時にルーティングして、レスポンスを1つの戻りメッセージに集約(結合)することで、このタスクを実現します。ペイロードを分割し、レスポンスを集約するこのプロセスを分割-結合パターンと呼びます。
分割-結合は、高速システムから低速システムの応答側のサービスに向けてペイロードを配信するシナリオで、全体的なレスポンス時間を最適化する場合に特に役立ちます。分割-結合を使用しない場合、通常、ペイロードの個々のメッセージは受信者によって順次解決されますが、応答側のシステムが低速な場合は時間がかかります。分割-結合を使用すると、複数のメッセージが同時に処理されるため、応答側のシステムの負担が減り、レスポンス時間が大幅に向上します。分割-結合を使用しない場合、全体的なレスポンス時間は、メッセージごとのレスポンス時間の合計になります。分割-結合を使用する場合、全体的なレスポンス時間は、個々のメッセージの最長レスポンス時間とシステムのわずかなオーバーヘッドの合計とほぼ同じになります。
分割-結合は、JDeveloperの分割-結合定義エディタで作成および設計します。その後、その分割-結合とそれに関連付けられたリソースをエクスポートしたり、テストおよび本番用にそれらのリソースをOracle Service Busコンソールにインポートできます。分割-結合はJDeveloperでは.flow
ファイルに保存され、常にWSDL操作に基づきます。分割-結合は、プロキシ・サービス、パイプラインまたは別の分割-結合から呼び出すことができます。分割-結合は、プロキシ・サービス、ビジネス・サービス、パイプラインまたは別の分割-結合を呼び出すことができます。
分割-結合には2種類のパターンがあります。1つは静的分割-結合で、既知の数のリクエストを処理し、もう1つは動的分割-結合で、可変数のリクエストを処理します。これらのパターンについては、以降の項で説明します。
注意:
分割-結合では、同じService Bus構成内の別の分割-結合を呼び出すことができるため、複雑な分割-結合機能を複数の分割-結合に分けることで、サービス設計がさらに柔軟になります。これにより、分割-結合機能のコンポーネント化と再利用が可能になります。分割-結合間にデータのマーシャリングやアンマーシャリングはないので、パフォーマンスは保持できます。
循環的な分割-結合参照を作成しないようにします。Service Busでは循環的な参照があるかどうかはチェックされません。
静的分割-結合では、分割-結合の構成に従って、ペイロードを固定数の新しいブランチに分割することで、Service Busメッセージ・フローのメイン実行スレッドから分岐します。設計時に、呼び出すサービスの数と種類を決定します。たとえば、顧客が、インターネット・サービス、TVサービス、電話サービスという3つの独立したサービスを含むケーブル・パッケージの注文を行う場合です。静的な使用例では、3つのリクエストすべてを、分割したパラレル・ブランチで実行できるため、標準的な順次実行と比較して実行時間のパフォーマンスが改善されます。
次のシナリオは、ある電話会社で、顧客からの通信サービス・パッケージの注文を処理するときに、静的分割-結合を使用する場合を示していします。この例では、顧客はDSLサービスとボイス・サービスを一度に申し込むことになります。電話会社は、ペイロードの各リクエストを単独で順に実行するのではなく、静的分割-結合を使用してメッセージを並行して実行できます。
開発者には、この特定のサービス・パッケージの受信サービス・リクエストが必ず2つ(DSLとボイス)になることがわかっているため、この場合、静的分割-結合が理想的なパターンといえます。リクエストを並列ブランチに分割することにより、リクエストを同時に処理できるようになるため、ペイロードを処理する際の全体的なレスポンス時間が向上します。すべてのメッセージの処理が完了すると、生成されたレスポンスが実行スレッドの1つの返信に集約されます。
図10-1は、2つの既知のサービス・リクエスト(DSLのアクティブ化と電話のアクティブ化)を分割し、各リクエストを並行処理して、レスポンスを1つの返信に結合する静的分割-結合を示しています。
動的分割-結合では、受信ペイロードの内容に基づいて新しいブランチを動的に作成することで、Service Busパイプラインのメイン実行スレッドから分岐します。作成されるメッセージ・リクエストの数は変更できます。動的分割-結合では、条件ロジックを使用して、作成するブランチの数を決定します。すべてのリクエストが同時に処理され、各レスポンスが1つの返信に集約されます。たとえば、個別の発注数が変化する注文を小売業者が一括して行う場合です。動的な使用例では、一括注文を解析して発注ごとに分離したメッセージ・リクエストを作成できます。静的な使用例と同様に、これらのメッセージは並行に実行できるため、パフォーマンスが改善されます。
次のシナリオは、ある会社で、従業員の事務用品を自動的に注文するときに動的分割-結合を使用する場合を示しています。注文が従業員による送信に基づいて毎週自動的に行われる場合、各週の注文で発生する個々の注文数を知る方法はありません。この会社では、各注文を個別に行うのではなく、動的分割-結合を使用して、注文を同時に行うことができます。
毎週送信される注文数がわからないため、この場合、動的分割-結合が理想的なパターンといえます。動的分割-結合では、すべての注文をループ処理し、並行に実行します。処理する注文数を制限することもできます。すべての注文の処理が完了すると、生成された注文レスポンスが実行スレッドの1つの返信に集約されます。
図10-2は、15件の注文を分割し、それらの注文を同時に処理して、レスポンスを1つの返信に結合する動的分割-結合を示しています。
分割-結合の「コンポーネント」ウィンドウは、分割-結合を構成するために使用できるすべての操作を示します。操作は、通信、フロー制御および割当てのカテゴリに分かれます。
通信操作では、分割結合と外部サービスとの相互運用方法を定義します。使用可能な操作は、表10-1を参照してください。
表10-1 分割-結合の通信操作
操作 | 説明 |
---|---|
サービスの呼出し |
この操作は、WSDLベースの非トランスポート型ビジネス・サービス、WSDLベース・プロキシ・サービスまたは分割-結合を呼び出します。「サービスの呼出し方法」を参照してください。 |
返信 |
この操作は、Oracle Service Busメッセージ・フローにレスポンスまたはフォルトを返します。「返信の構成方法」を参照してください。 |
フロー制御操作では、受信メッセージが分割-結合内を流れる方法を定義します。
表10-2 分割-結合のフロー制御操作
操作 | 説明 |
---|---|
For Each |
この操作は、スコープ内で構成されているロジックを指定回数だけ実行します。「リクエストの数に応じた反復方法」を参照してください。 |
条件操作 |
条件操作では、trueまたはfalseに評価する条件を定義し、各条件に対して定義された動作を実行できます。次の任意の条件を定義できます。
|
パラレル |
この操作によって、固定数の構成済パラレル・ブランチが作成されるため、固定数のメッセージ・リクエストを処理する静的分割-結合を定義できます。パラレルには、1つまたは複数のスコープ・ブランチがあります。「固定数のリクエストの並行処理方法」を参照してください。 |
エラーの生成 |
この操作は、分割-結合の通常の処理を停止させるエラーを生成します。エラー・ハンドラを使用せずにエラーが処理されると、分割-結合が終了し、Oracle Service Busのメッセージ・フローにフォルトが送信されます。「エラーの生成方法」を参照してください。 |
エラーの再生成 |
この操作では、エラー・ハンドラのcatchまたはcatch allによって捕捉されたエラーを再生成できます。エラーの再生成操作の名前および説明を構成できます。「エラーの再生成方法」を参照してください。 |
スコープ |
この操作は、それに含まれる操作の動きに影響を与えるコンテキストを作成します。スコープ内に定義されているローカル変数およびエラー・ハンドラは、このコンテキストに制限されます。スコープ操作の構成プロパティはありません。「コンテナ・ノードの作成方法」を参照してください。 |
待機 |
この操作では、分割-結合フローに一時停止を挿入して、他の依存ジョブの完了を少しの間待機できるようにします。指定した期間に到達すると、分割-結合の実行が再開されます。「処理での一時停止の挿入方法」を参照してください。 |
割当て操作では、変数の初期化や更新など、処理するメッセージ内のデータを操作できます。割当てノードでは、割当て、コピー、削除、挿入、Javaコールアウト、ログおよび置換の操作を実行できます。
表10-3 分割-結合の割当て操作
操作 | 説明 |
---|---|
割当て |
この操作では、XQuery式の結果を変数に割り当てることができます。「変数への値の割当て方法」を参照してください。 |
コピー |
この操作では、XPath式で指定された情報を、ソース・ドキュメントから、宛先ドキュメントにコピーできます。「ソース・ドキュメントから宛先ドキュメントへの値のコピー方法」を参照してください。 |
削除 |
この操作では、XPath式によって指定された一連のノードを削除できます。「一連のノードの削除方法」を参照してください。 |
挿入 |
この操作では、XPath式で選択したノードを基準として特定された場所にXQuery式の結果を挿入できます。「XQuery式の結果の挿入方法」を参照してください。 |
Javaコールアウト |
この操作では、検証、トランスフォーメーション、ロギングなどのJavaで処理するカスタム・アクションのための分割-結合から静的Javaメソッドを呼び出すことができます。「分割-結合でのJavaメソッドの呼出し方法」を参照してください。 |
ログ |
この操作では、管理者が適切なアクションを行うことができるように、指定された重大度でデータを記録します。「分割-結合データのログの記録方法」を参照してください。 |
置換 |
この操作では、XPath式で指定されたノードまたはノードのコンテンツを置き換えることができます。「ノードおよびそのコンテンツの置換方法」を参照してください。 |
分割-結合を使用して、SOAPヘッダーにメッセージ・コンテンツを格納するサービスのパフォーマンスを強化できます。デフォルトでは、分割-結合はSOAPヘッダーを伝播しません。ただし、これに対処するため、プロキシ・サービスがSOAPヘッダーを分割-結合に渡すことができるようにし、分割-結合が呼出しまたはレスポンスとしてSOAPヘッダーをプロキシおよびビジネス・サービスに渡すことができるように、WSDLファイルを変更できます。
この機能を有効にするには、分割-結合WSDLファイルと、分割-結合によって呼び出されるプロキシ・サービスやビジネス・サービスのWSDLファイルで、単一のリクエスト・メッセージまたはレスポンス・メッセージに本文部分とヘッダー部分を宣言する必要があります。メッセージ部分をWSDLファイルに宣言すると、分割-結合でリクエスト/レスポンス・メッセージ変数にSOAPヘッダー・コンテンツを利用できます。
次に、WSDLファイルでのメッセージとバインディング定義の例を示します。
メッセージ
<wsdl:message name="retrieveCustomerOverviewByIdRequestMessage"> <wsdl:part name="retrieveCustomerOverviewByIdRequest" element="co:retrieveCustomerOverviewByIdRequest"/> <wsdl:part name="serviceContext" element="sc:serviceContext"/> </wsdl:message>
バインド
<wsdl:input> <soap:body use="literal" parts="retrieveCustomerOverviewByIdRequest"/> <soap:header message="tns:retrieveCustomerOverviewByIdRequestMessage" part="serviceContext" use="literal"/> </wsdl:input>
分割-結合ではトランザクションの伝播がサポートされます。多数の分割-結合操作には、トランザクション・サポートを制御する特定のサービス品質(QoS)値を設定するオプションがあります。分割-結合操作で「必ず1回」というQoS値を設定すると、トランザクションが存在する場合に操作がトランザクションのコンテキストで必ず実行されます。
個々の操作にQoS値を設定すると、単一の分割-結合操作において、トランザクションのコンテキストで複数の操作を実行し、その他の操作をトランザクション外で実行する柔軟性が得られます。QoSが「必ず1回」に設定された操作はトランザクションで実行されます。QoSが「ベスト・エフォート」に設定された操作はトランザクションのコンテキストでは実行されません。
分割-結合では、例外時のトランザクション・ロールバックが処理されません。トランザクションの例外とロールバックの処理は、分割-結合と呼ばれるサービス・コンポーネントが担当します。
次の分割-結合操作では、トランザクションの伝播がサポートされます。
サービスの呼出し
割当て
削除
挿入
Javaコールアウト
置換
分割-結合では、セキュリティ・ポリシーは施行されず(つまり、ポリシーを含むWSDLファイルを備えた分割-結合は作成できない)、WSDLポリシーを含むWSDLベースのビジネス・サービスを分割-結合からコールすることはできません。
分割-結合を使用するときにセキュリティを確実に施行するには、プロキシ・サービスを使用して次のようにセキュリティの施行を処理します。
分割-結合を呼び出すインバウンド・プロキシを使用し、ポリシーを施行します。
分割-結合でポリシーを含むWSDLビジネス・サービスを呼び出す必要がある場合は、分割-結合でローカル・プロキシ(セキュリティ・ポリシーなしの構成)をコールし、必要なポリシーを含むビジネス・サービスをそのローカル・プロキシで呼び出すようにします。
サービス・レベル合意(SLA)のアラート・ルールでは、アラートの生成条件が定義されます。これらの条件は、通常、Service Busアプリケーションまたは特定のサービス・コンポーネントの全体的なヘルスのインジケータになります。分割-結合に対するSLAアラート・ルールの定義の詳細は、『Oracle Service Busの管理』のサービス・レベル合意のアラート・ルールの作成に関する項を参照してください。
分割-結合は、JDeveloperでのみ作成および構成できます。JDeveloperにはグラフィカルなモデリング・エディタが用意されており、キャンバスに操作をドラッグし、「プロパティ」ウィンドウでそれらのプロパティを構成することで、簡単に分割-結合をモデル化できます。
分割-結合は、JDeveloperで作成および構成します。Oracle Service BusコンソールでService Busプロジェクトを開発する場合、JDeveloperで作成した分割-結合をコンソールにインポートできます。分割-結合は.flow
ファイルで定義され、これはJDeveloperで分割-結合を作成するときに生成されます。このファイルには、プロキシ・サービス、ビジネス・サービス、または外部のWSDLリソースへの参照を含めることができます。分割-結合が依存するリソースは、分割-結合をアクティブ化する前に、サーバー上に存在する必要があります。
JDeveloperで分割-結合を作成するには:
すでにService Busアプリケーション内に存在するWSDLドキュメントを使用して、分割-結合を生成できます。アプリケーションにWSDLドキュメントが存在しない場合は、これをインポートして次の手順を実行します。
JDeveloperでWSDLドキュメントから分割-結合を生成するには:
分割-結合に追加する操作を「コンポーネント」ウィンドウから選択するため、分割-結合を構成するには、このウィンドウがJDeveloperで表示される必要があります。各操作は、JDeveloperの「プロパティ」ウィンドウを使用して構成するため、このウィンドウも表示される必要があります。
「コンポーネント」ウィンドウを表示するには
「コンポーネント」ウィンドウが「JDeveloper」ウィンドウに表示されない場合は、「ウィンドウ」→「コンポーネント」を選択します。
「コンポーネント」ウィンドウが「JDeveloper」ウィンドウの右側に表示されます。
開始ノードは、新しい分割-結合を作成すると、自動的に生成されます。これは、その他のすべてのノードを実行するための出発点です。開始ノードで構成する要素はその名前のみです。
開始ノード名を変更するには:
開始ノードのラベルの名前を変更するには、ノードの名前をクリックします。表示されたフィールドに、ノードの一意の識別文字列を入力します。入力した名前が、分割-結合エディタでノードの下に表示されます。
開始ノードに示されている外部サービスは、分割-結合のコンテキストの外部で呼び出されるサービスです。これらは、サービスの呼出しノードで指定されていますが、容易に使用できるようにリストされています。
外部サービスを表示するには:
外部サービスを表示するには、開始ノードの左矢印ボタンをクリックします。開始ノードの左側に「外部サービス」ボックスが表示されます。外部サービスの上にマウスを置くと、サービス・リソースの完全パスが表示されます。
開始ノードの変数には、分割-結合のノードによってグローバルに参照されるデータが格納されます。デフォルトでは、分割-結合が最初に作成されるときに、すべての開始ノードに、リクエストおよびレスポンスの両方の変数が割り当てられます。開始ノードから、新しいグローバル変数を作成するか、または既存のグローバル変数を編集することができます。
スコープの変数には、ローカルで(つまりデータの添付先のノードでのみ)参照されるデータが格納されます。スコープから、新しいローカル変数を作成したり、既存のローカル変数を編集できます。
グローバル変数とローカル変数の詳細は、「コンテナ・ノードの作成方法」を参照してください。
通信操作では、分割結合と外部サービスとの相互運用方法を定義します。これには、サービスの呼出し操作と返信操作があります。
サービスの呼出し操作を使用して、外部、WSDLベースのビジネス・サービス、WSDLベースのプロキシ・サービス、WSDLベースのパイプラインおよび分割-結合を呼び出します。
分割-結合からサービスを呼び出すには:
新しい分割-結合を作成すると、グローバルな返信ノードが自動的に生成されます。グローバルな返信の目的は、コール元のサービスに、レスポンスを送り返すことです。ただし、返信を分割-結合の他の場所(エラー・ハンドラ内など)にも生成できます。
返信は、変数の構成に応じて、レスポンスまたはフォルトをクライアントに送り返すことができます。使用できるフォルトのオプションは、返信がグローバルかローカルかによって異なります。
グローバルな返信(つまり、分割-結合でのエラー・ハンドラの外に生成される返信)には、SOAPフォルトは含まれませんが、WSDLフォルトが含まれる場合があります。これは、この場合、SOAPフォルト・オプションが無効になっているためです。
ローカルな返信(つまり、エラー・ハンドラに付加された返信)は、WSDLフォルトまたはSOAPフォルトを持つことができます。WSDLフォルトは、分割-結合の基盤となるWSDLファイルで定義されている場合にのみ使用できます。SOAPフォルト・オプションは、以前にエラー・ハンドラで定義されていれば、常に使用できます。
注意:
「Response」および「Fault」ボタンを使用して切り替えると、それぞれの構成がクリアされます。たとえば、以前に「SOAPフォルトの伝播」を選択していて、「レスポンス」の構成に切り替えると、「SOAPフォルトの伝播」の選択が解除されます。
デフォルトの返信操作には、フォルトをトリガーせずにフローのインスタンスを終了する暗黙的な終了操作が自動的に含まれます。終了操作は、開発環境には表示されません。
返信を構成するには:
状況によっては、返信操作に対してフォルトが使用できない、またはSOAPフォルトしか使用できない場合があります。
新しい返信操作を追加するには、「コンポーネント」ウィンドウの「通信」で、「返信」をクリックして、これをエディタの適切な場所にドラッグします。
「返信」ノードを選択して構成します。
「プロパティ」ウィンドウで「返信」タブをクリックします。
コール元のサービスにレスポンスを送り返すには、次のようにします。
「レスポンス」オプションを選択します。
「レスポンス」フィールドで、タイプが操作の出力メッセージ・タイプと一致するメッセージ変数を選択します。使用可能な変数のリストから選択するか、「変数の作成」をクリックして新しいメッセージ変数を定義します。
WSDLフォルトをレスポンスとして送信するには、次のようにします。
「フォルト名」オプションを選択します。
「フォルト名」フィールドで、メッセージ・フローに送り返すフォルトの名前を既存のフォルトのリストから選択します。
「フォルト変数」フィールドで、フォルトが割り当てられる変数を選択します。使用可能な変数のリストから選択するか、「変数の作成」をクリックして新しいフォルト変数を定義します。
エラー・ハンドラで定義されたSOAPフォルト変数にあるSOAPフォルトを伝播するには、「SOAPフォルトの伝播」を選択します。
返信ノードの名前を変更するには、「プロパティ」ウィンドウの「一般」タブをクリックして、一意の識別文字列を「名前」フィールドに入力します。
新しい名前が、分割-結合定義エディタでノードの下に表示されます。
「説明」フィールドに、重要と思われるノートを入力します。
JDeveloperのツールバーで、「保存」をクリックします。
フロー制御操作では、受信メッセージが分割結合内を移動する方法を定義します。この操作では、条件ロジック、エラー処理および並行処理を定義できます。
スコープは、様々な要素をまとめるコンテナです。このコンテナは、それに含まれる要素の動作に影響を与えるコンテキストを作成します。スコープ内に定義されているローカル変数およびエラー・ハンドラは、このコンテキストに制限されます。ただし、スコープ内の一部のノードは、ローカル(スコープ内)にも、グローバル(スコープ外)にも動作する場合があります。たとえば、特定のスコープ内のサービスの呼出しにより、そのスコープのコンテキストの外部のサービスがコールされる場合があります。
変数は定義されるスコープ内やそのスコープ内にネストされたすべてのスコープに表示できますが、外部のスコープに宣言される変数と同じ名前の変数が内部のスコープに宣言される場合、外部のスコープの変数が非表示になります。たとえば、外部のスコープ(So
)にmyVar
という変数を定義した後、外部のスコープSo
にある内部のスコープ(Si
)にもmyVar
変数を定義する場合、内部のスコープ(Si
)に定義したmyVar
にのみアクセスできます。このmyVar
により、外部スコープSo
で定義されたmyVar
がオーバーライドされます。
コンテナ・ノードを作成するには:
For Eachノードは、そのスコープ内で構成されたロジックを指定回数実行します。For Each操作を使用して、リクエストの数に応じて反復する条件付きロジックを作成します。これは、主に動的な分割-結合を作成するために使用されます。
リクエストの数に応じて反復するには:
並行操作によって、固定数の構成済パラレル・ブランチが作成されるため、固定数のメッセージ・リクエストを処理する静的分割-結合を作成できます。各ブランチには、任意の数の操作を含めることができる独自のスコープがあります。
パラレル・ノードは、基本的には、固定数の処理ブランチのプレースホルダであり、各ブランチには、それぞれのスコープがあります。2つのブランチは、並行操作をフローに追加すると自動的に生成されます。スコープごとに一意の処理ロジックを定義するには、適切な操作をスコープにドラッグします。スコープの追加ボタンを使用して、ブランチをさらに追加することもできます。
固定数のリクエストを並行処理するには:
Ifアクティビティは、分割-結合内で条件付きロジックを提供します。If条件全体の動作を決定する多数のノードから構成されます。各ノードを個別に構成する必要があります。Ifアクティビティを作成すると、アクティビティ内にIfブランチおよびElseブランチが自動的に生成されます。
IfおよびElse Ifの各ブランチは、Ifアクティビティ全体で、1つの条件付きロジック(XPath式で定義される)を提供します。これらのブランチでは、条件が満たされた場合に実行する処理ロジックも定義します。Elseブランチでは、条件が満たされない場合に実行する処理ロジックを定義します。Else Ifノードは、If操作に対して無制限に追加できます。
if-else条件付きロジックを定義するには:
「コンポーネント」ウィンドウの「フロー制御」で、「If」をクリックして、これをエディタの適切な場所のフローにドラッグします。
Ifノードが、IfブランチおよびElseブランチとともに表示されます。
Ifブランチを構成するには、次のようにします。
新しい「If」ノードで、「If」ブランチを選択します。
「プロパティ」ウィンドウで「条件」タブをクリックします。
「条件」フィールドの横で、「式ビルダー」アイコンをクリックして、XPath式ビルダーを起動し、If条件を定義する式を定義します。
If条件が満たされた場合に行われる処理を定義するには、操作を「コンポーネント」ウィンドウから「If」ブランチにドラッグしてから、その操作を「プロパティ」ウィンドウで構成します。
追加可能な操作の詳細は、「JDeveloperでのフロー制御操作の追加」および「JDeveloperでの割当て操作の追加」を参照してください。
Else Ifブランチを追加するには、次のようにします。
Ifノードの右上隅にある黄色いダイヤモンドの形のアイコンをクリックするか、Ifノード内で右クリックして「ElseIfの追加」を選択します。
Elseブランチの左側に新しいElse Ifブランチが表示されます。
手順2の説明に従い、Ifブランチと同様にElse Ifブランチを構成します。
どの条件も満たされない場合に行われる処理を定義するには、操作を「コンポーネント」ウィンドウから「Else」ブランチにドラッグしてから、その操作を「プロパティ」ウィンドウで構成します。
Ifノードまたはいずれかのブランチの名前を変更するには、ノードまたはブランチのアイコンを選択し、「プロパティ」ウィンドウの「一般」タブをクリックして、一意の識別文字列を「名前」フィールドに入力します。
「説明」フィールドに、重要と思われるノートを入力します。
JDeveloperのツールバーで、「保存」をクリックします。
エラー・ハンドラは、エラーを受信して、処理します。エラー・ハンドラは、開始ノードやスコープにアタッチできます。開始ノードにアタッチされている場合は、グローバル・エラー・ハンドラであり、ローカルのすべてのエラー生成ノードの出力に対して、すべてをキャッチします。スコープにアタッチされている場合は、ローカルで発生したエラーのみを処理します。
エラー・ハンドラを作成するには:
エラーの生成は、分割-結合の通常の処理を停止させるエラーを生成します。エラーがエラー・ハンドラを使用して処理されないと、分割-結合は終了し、Service Busメッセージ・フローにフォルトが送信されます。「エラーを発生させる」の構成には、「一般情報」タブへのエラーの性質の入力が含まれます(オプション)。
エラーを生成するには:
エラー・ハンドラにエラーの再生成操作を追加できます。この操作では、エラー・ハンドラのCatchまたはCatch All操作によって捕捉されたエラーを再生成できます。この操作では構成は必要ありませんが、名前を変更して説明を追加できます。
エラーを再生成するには:
次の条件が満たされるまで繰返しノードは、分割-結合内で条件付きロジックを提供します。次の条件が満たされるまで繰返しノードを定義すると、定義した条件がtrueに評価されるまで、関連付けられた操作が繰り返されます。関連付けられる操作は、次の条件が満たされるまで繰返しノードのループで定義されます。各ループが終了した後で、条件が評価されます。
trueに評価されるまで操作を繰り返すには:
Whileノードは、分割-結合内で条件付きロジックを提供します。Whileノードを定義する場合、定義した条件がfalseに評価されるまで、関連付けられた操作が繰り返されます。関連付けられる操作は、次の条件が満たされるまで繰返しノードのループで定義されます。各ループが終了する前に、条件が評価されます。
falseに評価されるまで操作を繰り返すには:
割当て操作には、割り当て、コピー、削除、挿入、Javaコールアウト、ログ、および置換があります。各割当ては、これらの1つ以上の操作から構成され、この操作はデザイン・ビューから割当てに追加できます。次に、分割-結合で使用できる割当て操作を示します。
割当て: 変数にXQuery式またはXSLT式の結果を割り当てます。
コピー: XPath式で指定された情報を、ソース・ドキュメントから、宛先ドキュメントにコピーします。
削除: XPath式で指定されたノードのセットを削除します。
注意:
Service Busの削除とは異なり、変数全体ではなくXPath式のみを分割-結合から削除できます。
挿入: XPath式で選択したノードを基準として特定された場所にXQuery式の結果を挿入します。
Javaコールアウト: 検証、変換、ロギングなどの処理のJavaメソッドを呼び出します。
ログ: サーバー・ログ・ファイルに分割-結合データのログを指定の重大度で記録します。
置換: XPath式で指定されたノードまたはノードのコンテンツを置き換えます。
様々なXQueryおよびXSLTリソースを使用して、割当て操作の値を導出する変換および式を定義できます。ほとんどの割当て操作では次の手法がサポートされます。詳細は、次に示すリンクで確認できます。
『Oracle SOA SuiteでのSOAアプリケーションの開発』のXQueryマッパーでの変換の作成に関する項
『Oracle SOA SuiteでのSOAアプリケーションの開発』のXSLTマップ・エディタでの変換の作成に関する項
注意:
分割-結合エディタの割当て操作は、パイプラインの対応するアクションと同じです。ただし、重要な相違点の1つとして、XQuery、XSLTまたはXPathエディタを使用して、分割-結合コンテキストの式を編集する場合に、分割-結合に対して内部の変数およびネームスペースのみが使用可能であるという点があります。
分割-結合における割当て機能は、XPath、XQueryおよびXSLT式を単純型の変数にすることで解決するWS-BPEL仕様に準拠しています。式を分割-結合にある変数にバインドするためのサポート対象の単純な型は、文字列、ブールおよび浮動小数です。割当て操作は、型の値を定義された変数型に変換します。
次に例を示します。
<order><number>4</number></order>
を文字列で定義されたレスポンス変数($response.result
)に割り当てる場合、Service Busでは、子要素および値を単純にコピーすることで<number>4</number>
を文字列で返します。
<order><number>4</number></order>
を文字列変数(myStr
など)にマップして、$myStr
を$response.result
に割り当てると、Service Busは$response.result
の文字列変数に割り当てる前にまず$myStr
の値を文字列に変換するため、<result>4</result>
を返します。
割当てを使用してデータを操作するには、XSLTまたはXQueryの式やリソースを使用して変数を初期化および更新します。動的XSLTまたはXQueryも使用できます。
Service Busでは、インラインXQueryの変数をバインドするとき、型がxs:string
であると仮定します。このため、xs:string
と互換性のない定数の操作の場合に、解析エラーが発生する可能性があります。型の互換性を保証するためには明示的なXQueryキャストを使用します。たとえば、次のインラインXQueryは失敗します。$itemsTotal
は型xs:double
ですが、xs:string
としてバインドされ、10000でのテストで互換性がありません。
if ($itemsTotal < 10000) then . . .
このインラインXQueryが機能するようにするには、$itemsTotal
をxs:double
に明示的にキャストします。
if (($itemsTotal cast as xs:double) < 10000) then . . .
文字列の結果または変数への割当て操作を作成するとき、式が文字列値を返すようにしてください。非String値をStringの結果またはStringのグローバル変数に割り当てると、WS-BPEL仕様で定められているようにMismatchedAssignmentFailure
例外は発生しません。
変数に値を割り当てるには:
コピー操作を使用すると、XPath式またはリテラル値で指定された情報を、ソース・ドキュメントから宛先ドキュメントにコピーできます。これは、分割-結合エディタに固有の操作です。
値をコピーするには:
削除操作では、XPath式によって指定された一連のノードを削除できます。
注意:
Service Busの削除とは異なり、変数全体ではなくXPath式のみを分割-結合から削除できます。
一連のノードを削除するには:
Javaコールアウト操作では、検証、変換、ロギングなどのJavaで処理するカスタム操作のために、分割-結合から静的Javaメソッドを呼び出すことができます。
分割-結合でJavaメソッドを呼び出すには:
ログ操作により、サーバー・ログ・ファイルに特定の重大度の分割-結合データのログを記録できます。管理者は、ログ情報を使用して、記録したデータの重大度に基づく適切なアクションを行うことができます。
分割-結合データのログを記録するには:
分割-結合はJDeveloperで作成して構成しますが、分割-結合をOracle Service Busコンソールにインポートしてコンソールのプロジェクトに追加できます。これらは、プロジェクト全体をインポートすることでもインポートできます。コンソールから、ディスパッチ・ポリシーの指定、XQueryバージョンの更新およびSLAアラートの定義を行うことができます。
コンソールで分割-結合を操作する前に、これをJDeveloperからエクスポートしてコンソールにインポートする必要があります。リソースをコンソールにインポートしたら、分割-結合定義エディタでこれを開き、特定のプロパティの構成やSLAアラート・ルールの定義を行うことができます。リソースのエクスポートおよびインポートについては、「Oracle Service Busコンソールでのリソースのインポートとエクスポート」を参照してください。
Oracle Service Busコンソールで構成できるのは、分割-結合の特定のプロパティのみです。分割-結合の処理ロジックは構成できません。
コンソールで分割-結合を構成するには:
この項では、サンプル・シナリオを使用して静的分割-結合および動的分割-結合を作成する方法について説明します。
このシナリオでは、テレビ、電話、インターネット・サービスを含む電話会社のケーブル・サービスのパッケージの注文を処理するService Availabilityという名前の新しい分割-結合を作成します。パッケージの注文を受信し、各種類のサービスに対して受注確認を返信するというのが、分割-結合での考え方になります。この例では、注文ごとに各タイプのサービスについて3つのメッセージ・リクエストがあるため、Service Availabilityは静的分割-結合として設計されます。この例では、顧客はテレビとDSLサービスのみをリクエストします。
Service Availability分割-結合の作成には次の手順が含まれます。
注文の実行に使用するWSDL操作に基づいて分割-結合を作成します。この例では、WSDL操作を「telecom」と呼びます。
WSDL操作を選択すると、次の図に示すように、新しく作成された分割-結合のスケルトンが分割-結合エディタに表示されます。スケルトンは開始ノード、受信ノード、返信ノードから構成されます。「プロパティ」ウィンドウにあるラベルは、この特定の分割-結合の各ノードの固有の機能をより適切に反映したものに編集されます。
開始ノードには、最初に選択されたWSDL操作によって決定されたリクエスト変数とレスポンス変数が両方とも含まれます。受信ノードでは受信リクエスト・メッセージ(この例では3種類以下のケーブル・サービス)を受信し、返信ノードではレスポンス・メッセージを生成して、これをクライアントに戻します。
注意:
受信ノードには、これ以上の構成は必要ありません。同様に、返信では、エラー・フォルトを生成する場合(このシナリオには該当しない)を除き、これ以上の構成は必要ありません。
最初の割当てPrepare Output Messageには、後からノードでその中のデータを操作きるような形でレスポンス変数を用意する割当て操作が含まれます。この出力メッセージは、分割-結合の最終的な返信ノードに中継され、その結果、元のクライアントに戻ります。
パラレル・ノードには、ケーブルTVの可用性の確認と、DSLの可用性の確認の2つの主要ブランチがあります。各ブランチはいくつかのアクションで構成されており、そのシーケンスと全体的な構成は両方のブランチで同じになっています。
各パラレル・ブランチの最初の割当てであるPrepare Input Addressでは、その場所でサービスが利用できるかどうかを確認するために、受信した顧客アドレス・データを、参照されている変数にコピーします。この割当ては、各ブランチに対して同じになっており、これはブランチが追加される場合でも同様です。
次に外部サービスが呼び出されて、リクエストされたサービスのタイプが顧客のいる場所で利用可能であるかどうかがチェックされます。各ブランチには、1つのサービスを呼び出す、「TVの利用可能性のチェック」、および「DSLの利用可能性のチェック」が含まれます。それぞれの外部サービスの呼出しでは、顧客のアドレス(前の手順で初期化された変数に格納されている)が、その場所でのサービスの利用可能性と比較されます。結果は出力変数に格納され、次の手順であるブランチの最終的な割当てに渡されます。
最終的な2つの割り当て、「出力メッセージのケーブルTVステータスの更新」と「出力メッセージのDSLステータスの更新」では、外部サービス呼出しの結果を取得し、置換操作を使用して、これを出力メッセージに入れます。集約されたレスポンスは、これ以上の構成が必要でない最終的な返信ノードにある元のクライアントに送信されます。
このシナリオでは、個別の発注の数が(発注数が固定してる注文とは異なり)変化する、小売業者からの一括注文を処理する分割-結合を設計する場合を考えてみます。一括注文を受信し、その中にある各注文に受注確認を返信するというのが、分割-結合での考え方になります。個別の発注数リクエストの数は変化し、設計時にその数を知ることはできないので、これは動的な分割-結合になります。
この分割-結合の作成には次のタスクが含まれます。
注文の実行に使用するWSDL操作に基づかない新しい分割-結合を作成します。この例では、WSDL操作を「batchOrders」と呼びます。この操作が選択されると、開始ノード、受信ノード、返信ノードから構成される新しく作成された分割-結合のスケルトンが、分割-結合エディタに表示されます。これらのラベルは、この特定の分割-結合の各ノードに固有の機能をより適切に反映するように、全般プロパティ・タブで編集されます。
開始ノードである「注文の実行」には、リクエスト変数inputVarとレスポンス変数outputVarの両方が含まれます。受信ノードである「一括注文リクエストの受信」は、リクエスト変数(この例の場合は発注)の内容を初期化し、返信ノードである「注文の実行への返信」は、レスポンス変数に集約された受注確認に基づいてレスポンスをクライアントへ戻します。この例では、「注文の実行」には、個別の注文を承認するために呼び出される外部サービス「Order」へのコールアウトが含まれています。
注意:
受信ノードには、これ以上の構成は必要ありません。同様に、返信ノードには、エラー・フォルトを生成する場合(このシナリオには該当しない)を除き、これ以上の構成は必要ありません(フォルトの生成の詳細は、「返信の構成方法」を参照)。
最初の割当てである「出力メッセージの用意」には、後からレスポンス変数(ここでは理解を容易にするために「出力メッセージ」というラベルになっています)をノード内にキャプチャしたデータで作業(つまり、変数へのコピー、挿入、割り当て、置換、削除)できるような形で用意する割当て操作が含まれます。この場合、データは受注確認やエラーで構成されます。この出力メッセージは、分割-結合の最終的な返信ノードに中継され、その結果、元のクライアントに戻ります。
For Eachである「注文全体で繰返し」には、一括注文内にある個別の注文を1つずつ解析して、承認のために外部プロキシに送信し、レスポンス内にある受注確認をキャプチャするロジックが含まれます。注文に問題がある場合、呼び出されたプロキシからエラーが送信され、エラー・ハンドラでキャプチャされます。次の図にFor Eachロジックのスコープ全体を示します。
次に外部サービス「注文の有効性のチェック」が呼び出され、個別の発注ごとに承認を行います。注文が受け入れられる場合、サービスは受注確認で応答します。注文が受け入れられない場合、サービスはエラーで応答します。この結果は出力変数に格納され、次の手順で説明する最終的な割当てに渡されます。
最終的な割当てである「出力メッセージの注文ステータスの更新」は、外部サービス呼出しの結果を取得し、挿入操作を使用してこの結果を出力メッセージにコピーします。集約されたレスポンスは、これ以上の構成が必要でない最終的な返信ノードにある元のクライアントに送信されます。
エラー・ハンドラは、呼び出されたサービスから返されたすべてのエラーをキャプチャします。エラー・ハンドラは、エラーを取得し、割当て操作を使用してこれを出力メッセージに挿入します。