SOA@Oracle
非同期処理の要 - 相関セット(Correlation Set)の設定方法
最終更新:
Bot(ページ名リンク)
-
view
非同期処理の要 - 相関セット(Correlation Set)の設定方法
はじめに
Oracle BPEL Process Managerからコールバックのある非同期サービスを呼び出す方法として、WS-Addressingを使う方法がありますが、連携対象のシステムのすべてでWS-Addressingを利用するのは、工数もかかるので現実的ではないでしょう。
ここでは、WS-Addressingを使わずに非同期処理を実現するために、BPEL仕様で定義されている相関セット(Correlation Set)の使い方をご紹介します。
ここでは、WS-Addressingを使わずに非同期処理を実現するために、BPEL仕様で定義されている相関セット(Correlation Set)の使い方をご紹介します。
シナリオ
ここでは、例として以下のようなシナリオを実装してみましょう。

出荷管理システムが出荷依頼を受けてから、出荷が完了して出荷結果を返すまでには、数時間から数日かかります。ということで、出荷管理システムとのやりとりは非同期で行いたい、というのがシナリオです。さきほども書いたとおり、WS-Addressingを使えば、非同期コールバックのシナリオは簡単に実装できます。ですが、WS-Addressingを実装するには、既存の出荷管理システムに手を加えなければいけません。なるべく既存システムに手をいれずに実装するために、以下のような実装方法を今回はとります。

出荷管理システムとWebサービスでやりとりをするのではなく、データベースの2つの表、出荷依頼受付表と出荷結果表を用意します。出荷管理システムは、出荷受付表に入ったデータを処理し、結果を出荷結果表に挿入します。このようにデータベースの表を介在させることで既存の出荷管理システムへの改修を最小化します
Oracle BPEL Process Managerから2つの表へ挿入、ポーリングを行う部分は、DB Adapterを利用します。
Oracle BPEL Process Managerから2つの表へ挿入、ポーリングを行う部分は、DB Adapterを利用します。
ただし、このシナリオを実現するためには、一点追加で設定が必要です。それが相関セット(Correlation Set)です。
出荷結果表から出荷結果をポーリングした後、どのインスタンスにそのメッセージを紐づけるかを決定する仕組みが必要です。たとえば、受注IDが1000と1001の2つのインスタンスがあった場合、出荷結果に含まれる受注IDからどちらのインスタンスにメッセージを紐づけるかを決定する必要があります。相関セットを使ってこの紐付けを定義します。
出荷結果表から出荷結果をポーリングした後、どのインスタンスにそのメッセージを紐づけるかを決定する仕組みが必要です。たとえば、受注IDが1000と1001の2つのインスタンスがあった場合、出荷結果に含まれる受注IDからどちらのインスタンスにメッセージを紐づけるかを決定する必要があります。相関セットを使ってこの紐付けを定義します。
ここでは、DB Adapterを使った相関セットの例を紹介していますが、同じ手法は、SOAPや各種アダプタでも利用できます。
では、具体的な実装方法を見ていきましょう。
設定方法
今回の実装には、以下の表を用います。
出荷依頼受付表(SHIPPING_REQUEST)
| 列名 | データ型 |
| ORDER_ID | NUMBER |
| PRODUCT | VARCHAR2(2000) |
出荷結果表(SHIPPING_RESULT)
| 列名 | データ型 |
| ORDER_ID | NUMBER |
| SHIPPING_DATE | DATE |
Database Adapterを利用して、SHIPPING_REQUESTにデータを挿入するサービスに対応するパートナ・リンクとSHIPPING_RESULTからポーリングでデータを取得するパートナ・リンクを作成し、それぞれInvokeアクティビティ、Receiveアクティビティと紐付けを行います。

ここから相関セットを設定していきますが、手順としては以下の3つの設定を行います。
1. プロパティの設定
2. プロパティ・エイリアスの設定
3. 相関セットの設定
4. 相関の設定
1. プロパティの設定
2. プロパティ・エイリアスの設定
3. 相関セットの設定
4. 相関の設定
1. プロパティの設定
まずは、相関のキーとなる項目を設定します。
構造ペインから[プロパティ]を選択し、[作成 プロパティ...]を選択します。
まずは、相関のキーとなる項目を設定します。
構造ペインから[プロパティ]を選択し、[作成 プロパティ...]を選択します。

今回のケースでは、受注IDを相関のキーとしたいので、名前に「orderId」タイプに「int」を指定します。

2. プロパティ・エイリアスの設定
次に設定したプロパティが、メッセージのどの部分に対応するかを設定します(プロパティ・エイリアス)。
ここでは、SHIPPING_REQUEST表に挿入するサービスのorderIdと、SHIPPING_RESULT表からポーリングして取得するメッセージのorderIdをプロパティ・エイリアスとして設定します。
次に設定したプロパティが、メッセージのどの部分に対応するかを設定します(プロパティ・エイリアス)。
ここでは、SHIPPING_REQUEST表に挿入するサービスのorderIdと、SHIPPING_RESULT表からポーリングして取得するメッセージのorderIdをプロパティ・エイリアスとして設定します。
構造ペインから[プロパティ・エイリアス]を選択し、[作成 プロパティ・エイリアス...]を選択します。

メッセージ・・タイプ・パートとして[Partner Links] > [SHIPPING_REQUEST] > [INSERT_SHIPPING_REQUEST.wsdl] > [メッセージ・タイプ] > [ShippingRequestCollection_msg] > [パート- ShippingRequestCollection]を選択します。これで、SHIPPING_REQUEST表に対して挿入を行うさいの入力メッセージのパートが選択できました。画面下部の[問合せ]には、そのメッセージのなかでどのノードをプロパティに紐づけるかを定義します。ここでは、受注IDに対応する[/ns1:ShippingRequestCollection/ns1:ShippingRequest/ns1:orderId]を入力しています。[Ctrl]+[Space]をおすことで入力補完機能が働きますので、[問合せ]を入力する際には、入力補完機能を活用してください。
入力が完了したら[OK]を押します。これで、プロパティ・エイリアスがひとつ定義できました。
入力が完了したら[OK]を押します。これで、プロパティ・エイリアスがひとつ定義できました。

同様の手順でSHIPPING_RESULT表からデータを取得するサービスに対してもプロパティ・エイリアスを設定します。メッセージ・・タイプ・パートとして[Partner Links] > [SHIPPING_RESULT] > [POLLING_SHIPPING_RESULT.wsdl] > [メッセージ・タイプ] > [ShippingResultCollection_msg] > [パート- ShippingResultCollection]を選択します。[問合せ]には、[/ns1:ShippingResultCollection/ns1:ShippingResult/ns1:orderId]を入力します。
これで、プロパティ・エイリアスの設定が完了しました。
これで、プロパティ・エイリアスの設定が完了しました。
3. 相関セットの設定
次に相関セットを作成します。相関セットとは、プロパティの集合で、実際にインスタンスの判別に利用されるものです。
次に相関セットを作成します。相関セットとは、プロパティの集合で、実際にインスタンスの判別に利用されるものです。
構造ペインから[相関セット]を選択し、[作成 相関セット...]を選択します。

[名前]を規定値のままの[CorrelationSet_1]と、[追加]アイコンをクリックします。手順1で作成したorderIdをプロパティとして選択しましょう。これで、相関セットの設定が完了しました。

4. 相関の設定
最後にどのアクティビティで紐付け(相関)を行うのかを設定します。これで非同期処理がいよいよ実現されます。今回のケースでは、SHIPPING_REQUEST表に挿入を行っている[Invokle_SHIPPING_REQUEST]InvokeアクティビティとSHIPPING_RESULT表からデータを取得している[Receive_SHIPPING_RESULT]Receiveアクティビティに対して、相関の設定を行います。
最後にどのアクティビティで紐付け(相関)を行うのかを設定します。これで非同期処理がいよいよ実現されます。今回のケースでは、SHIPPING_REQUEST表に挿入を行っている[Invokle_SHIPPING_REQUEST]InvokeアクティビティとSHIPPING_RESULT表からデータを取得している[Receive_SHIPPING_RESULT]Receiveアクティビティに対して、相関の設定を行います。
まずは、[Invokle_SHIPPING_REQUEST]Invokeをダブルクリックし、[相関]タブを開き、[追加]から先ほど作成した相関セット[CorrelationSet_1]を選択します。

[相関]タブにもどって、[開始]に[はい]を[パターン]に[アウト]を設定します。[開始]は相関セットを初期化する必要がある際には、[はい]を選択します。今回のケースだとこのアクティビティで[CorrelationSet_1]を初めて使用しているので、[はい]を選択しています。[パターン]とは、Invokeアクティビティのリクエスト/リプライのどちらに相関をしかけるかを設定するために使用されます。今回はリクエスト・メッセージに対して相関をセットしたいので[アウト]を設定しています。

同様に[Receive_SHIPPING_RESULT]Receiveアクティビティに対しても相関を設定します。こちらは、先ほど初期化した相関セットをそのまま利用しますので、[開始]には[いいえ]を設定します。

以上で、相関セット(Correlation Set)による非同期処理の設定が完了しました。
ご質問は、以下のフォームまでお願いします。トラックバック( http://www28.atwiki.jp/oraclesoa/tb/21.html )も大歓迎です。
&trackback()


