この章では、BPELプロジェクトであるSOAOrderBookingプロジェクトの作成方法について説明します。 項目は次のとおりです。
第8.11項「注文に対して手動による承認が必要かどうかの判断(「RequiresManualApproval」decideアクティビティ)」
第8.12項「手動による承認が必要な注文を処理するためのフォームの設定(「requiresApproval」スイッチ)」
BPELプロジェクトであるSOAOrderBookingプロジェクトは、SOA Order Bookingアプリケーションのメイン・フローを表します。 このプロジェクトは、注文情報を適切な時期に適切なサービスに送信します。 たとえば、CreditServiceに連絡して顧客のクレジット・カードを確認し、そのクレジット・カードが受入れ可能である場合は、サプライヤ(Select ManufacturerおよびRapid Distributors)に連絡して注文の価格見積を取得します。
SOAOrderBookingプロジェクトは大規模なプロジェクトです。 この章では、最初にプロジェクトの主なブロックの概要を示した後で、各ブロックの詳細について説明します。
表8-1に、SOAOrderBookingプロジェクトの主なブロックをリストします。
表8-1 SOAOrderBookingプロジェクトの主なブロック
| ブロック | タイプ | 説明 |
|---|---|---|
|
receiveInput |
receiveアクティビティ |
このアクティビティは、注文情報などの着信リクエストを受信します。 |
|
InsertOrderIntoDB |
スコープ |
このスコープでは、注文情報がデータベースに挿入されます。 |
|
CustomerService |
スコープ |
このスコープでは、顧客の情報がデータベースから取得されます。 |
|
CreditService |
スコープ |
このスコープでは、顧客の与信が受入れ可能であることが検証されます。 |
|
RequiresManualApproval |
デシジョン |
このスコープはdecideアクティビティです。ルール・リポジトリに設定されているルールを参照して、注文にマネージャの承認が必要かどうかを判別します。 マネージャは注文を承認または却下できます。 |
|
requiresApproval |
スイッチ |
このスイッチでは、マネージャが注文を承認したか却下したかが確認され、適切なアクティビティが実行されます。 承認された注文の場合は、このSOAOrderBookingプロジェクトの残りのアクティビティが続行されます。 却下された注文の場合は、フォルトがスローされ、アクティビティは続行されません。 |
|
SelectSupplier |
スコープ |
このスコープでは、注文を履行するサプライヤ(Select ManufacturerまたはRapid Distributors)が選択されます。 |
|
PostFulfillmentReq |
スコープ |
このスコープは、FulfillmentESBプロジェクトをコールします。このプロジェクトは、注文の出荷方法を決定します。 |
|
SetFinalOrderStatus |
スコープ |
このスコープでは、最終的な注文ステータスがデータベースに書き込まれます。 |
|
NotifyCustomer |
スコープ |
このスコープは電子メール・サービスです。 顧客に対して、注文が正常に処理されたことを通知する電子メールを送信します。 |
|
callbackClient |
invokeアクティビティ |
このinvokeアクティビティは、処理が終了したことをclientに通知します。 |
図8-1に、最小化された状態のブロックが表示されたJDeveloperのSOAOrderBooking.bpelページを示します。 後続の各項では、各ブロックを開いてその内容を示し、ブロックの作成方法について説明します。
アプリケーション・ナビゲータで、「SOADEMO」アプリケーションを右クリックし、「新規プロジェクト」を選択して新規ギャラリを表示します。
新規ギャラリの「カテゴリ」セクションで、「General」を開き、「Projects」を選択します。 「項目」の下にある「BPELプロセス・プロジェクト」を選択します。
「OK」をクリックします。 BPELプロジェクト作成ウィザードが表示されます。
BPELプロジェクト作成ウィザードのプロジェクトの設定ページで、次の操作を実行します。
名前: 「SOAOrderBooking」と入力します。
ネームスペース: 「http://www.globalcompany.com/ns/OrderBooking」と入力します。
デフォルトのプロジェクト設定を使用: このオプションを選択します。
テンプレート: 「空のBPELプロセス」を選択します。
「終了」をクリックします。
次のファイルを、soademo_101310_prod.zipファイルからSOAOrderBooking¥bpelディレクトリにコピーします。
SOAOrderBooking.wsdl
OrderBookingPO.xsd
OrderBookingRules.xsd
soademo_101310_prod.zipファイルでは、これらのファイルはSOAOrderBooking¥bpelディレクトリにあります。
このステップでは、SOAOrderBookingプロジェクトに対してinputVariableとoutputVariableという2つの変数を作成します。 プロジェクト・レベルで定義した変数には、プロジェクト内のすべてのアクティビティがアクセスできます。
「SOAOrderBooking」スコープをダブルクリックします。 横に表示されている「SOAOrderBooking」テキストをダブルクリックすることもできます。
「Process」ダイアログが表示されます。
「Process」ダイアログで、「変数」タブをクリックします。
inputVariableという変数を作成します。
「作成」をクリックして、「変数の作成」ダイアログを表示します。
「変数の作成」ダイアログで次の値を設定します。
名前: 「inputVariable」と入力します。
タイプ: 「メッセージ・タイプ」を選択して懐中電灯アイコンをクリックします。 「タイプの選択」ダイアログが表示されます。
「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「プロジェクトのWSDLファイル」→「SOAOrderBooking.wsdl」→「メッセージ・タイプ」→「SOAOrderBookingRequestMessage」の順に選択します。
「タイプの選択」で、「OK」をクリックします。 「変数の作成」ダイアログは次のように表示されます。
「変数の作成」ダイアログで、「OK」をクリックします。 「Process」ダイアログに戻ります。 このダイアログに「inputVariable」が表示されていることを確認します。
outputVariableという2番目の変数を作成します。
「Process」ダイアログで「作成」をクリックして、「変数の作成」ダイアログを表示します。
「変数の作成」ダイアログで次の値を設定します。
名前: 「outputVariable」と入力します。
タイプ: 「メッセージ・タイプ」を選択して懐中電灯アイコンをクリックします。 「タイプの選択」ダイアログが表示されます。
「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「プロジェクトのWSDLファイル」→「SOAOrderBooking.wsdl」→「メッセージ・タイプ」→「SOAOrderBookingResponseMessage」の順に選択します。
「タイプの選択」で、「OK」をクリックします。 「変数の作成」ダイアログは次のように表示されます。
「変数の作成」ダイアログで、「OK」をクリックします。
「Process」ダイアログに、次の2つの変数が表示されていることを確認します。
図8-9 inputVariableおよびoutputVariableが表示された「Process」ダイアログ

「Process」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
この「client」パートナ・リンクはclientを表します。このclientは、receiveInputアクティビティにデータを渡し、戻り値を受信するためにフローの最後に起動されます。
コンポーネント・パレットが表示されていない場合は、「表示」→「コンポーネント・パレット」の順に選択します。 コンポーネント・パレットのドロップダウンから、「Services」を選択します。
コンポーネント・パレットから「Partner Link」アイコンをドラッグして、「サービス」スイムレーンにドロップします。 「パートナ・リンクの作成」ダイアログが表示されます。
「パートナ・リンクの作成」ダイアログで次の値を設定します。
名前: 「client」と入力します。
WSDLファイル: 「サービス・エクスプローラ」アイコン(左から2番目)をクリックし、「サービス・エクスプローラ」ダイアログを表示します。 「サービス・エクスプローラ」ダイアログで、「プロジェクトのWSDLファイル」を開き、「SOAOrderBooking.wsdl」を選択します。
「サービス・エクスプローラ」で、「OK」をクリックします。
パートナ・リンク・タイプ: 「SOAOrderBooking」を選択します(自動的に表示されます)。
パートナ・ロール: 「SOAOrderBookingRequester」を選択します。
マイ・ロール: 「SOAOrderBookingProvider」を選択します。
プロセス: 空白のままにします。
「OK」をクリックする前に、「名前」が「client」に設定されたままであることを確認します。 この名前は、JDeveloperによって、他のフィールドが自動的に挿入されるときに、「SOAOrderBooking」に変更されている場合があります。
「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
入力データをclientから受信するためのreceiveアクティビティを作成します。 このreceiveアクティビティでは、データをJMSトピックに送信するためのセンサーも定義します。
receiveアクティビティを作成する手順は、次のとおりです。
コンポーネント・パレットのドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Receive」アイコンをドラッグして、ページ上の「アクティビティをここにドロップ」と表示されている場所にドロップします。
この時点で、ページが次のように表示されていることを確認します。
次のいずれかを実行して、「Receive」ダイアログを表示します。
「Receive_1」アクティビティの横にある矢印のいずれかをドラッグして、「client」パートナ・リンクにドロップします。 receiveアクティビティがパートナ・リンクに関連付けられます。
新規の「Receive_1」アクティビティをダブルクリックします。
「Receive」ダイアログで、次の値を入力します。
名前: 「receiveInput」と入力します。
パートナ・リンク: 「client」に設定されていることを確認します。 この値は、「Receive_1」アクティビティの矢印をドラッグして、「client」パートナ・リンクにドロップした場合は自動的に表示されます。 設定されていない場合は、懐中電灯をクリックして「パートナ・リンクの選択」ダイアログを表示し、「client」を選択します。
図8-13 「receiveInput」receiveアクティビティに関する「パートナ・リンクの選択」ダイアログ

「パートナ・リンクの選択」ダイアログで、「OK」をクリックします。
Operation: 「initiate」を選択します。 この値は自動的に表示されます。
Variable: 「変数の参照」アイコン(右側にあるアイコン)をクリックします。 「変数の選択」ダイアログで、「inputVariable」を選択します。
図8-14 「receiveInput」receiveアクティビティに関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
インスタンスの作成: このオプションを選択します。
「Receive」ダイアログは次のように表示されます。
図8-15 「receiveInput」receiveアクティビティに関する「Receive」ダイアログ

「Receive」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このreceiveアクティビティでは、receiveアクティビティ用のアクティビティ・センサーが作成されます。 このアクティビティを実行した後は、このセンサーによって注文情報がJMSトピックに書き込まれます。 このJMSトピックのコンシューマは存在しません。このセンサーの目的は、注文情報を別の宛先に送信する方法を示すことです。
receiveInputアクティビティをダブルクリックして、「Receive」ダイアログを表示します。
「Receive」ダイアログの「センサー」タブをクリックします。
「作成」をクリックして、新規のセンサーを作成します。 「アクティビティ・センサーの作成」ダイアログが表示されます。
「アクティビティ・センサーの作成」ダイアログで、「名前」を「InstanceStart」に設定します。
「評価時間」を「完了」に設定します。 センサーの起動時間が指定されます。 「完了」は、このアクティビティの実行後にセンサーが起動されることを示します。
「アクティビティ変数センサー」セクションで、「作成」をクリックし、「アクティビティ変数センサーの作成」ダイアログを表示します。
「アクティビティ変数センサーの作成」ダイアログで、「変数XPath」の鉛筆アイコンをクリックします。 「変数XPathビルダー」ダイアログが表示されます。
「変数」→「プロセス」→「変数」→「inputVariable」の順に選択します。
「変数XPathビルダー」で、「OK」をクリックします。 「アクティビティ変数センサーの作成」ダイアログに、次の値が表示されます(図8-16を参照)。
変数XPath: $inputVariable
出力ネームスペース: http://www.globalcompany.com/ns/OrderBooking
出力データ型: SOAOrderBookingRequestMessage
「アクティビティ変数センサーの作成」ダイアログで、「OK」をクリックします。 「アクティビティ・センサーの作成」ダイアログ(図8-21)に戻ります。
「アクティビティ・センサーの作成」ダイアログの「センサー・アクション」セクションで、「追加」アイコンをクリックします。 「センサー・アクションの選択」ダイアログが表示されます。
「センサー・アクションの選択」ダイアログで、「センサー・アクション」を選択し、棒型アイコンから「センサー・アクション」を選択します。 「センサー・アクションの作成」ダイアログが表示されます。
「センサー・アクションの作成」ダイアログで、次の操作を実行します。
名前: 「InstanceStart」と入力します。
パブリッシュ・タイプ: 「JMSトピック」を選択します。
JMSコネクション・ファクトリ: 「jms/TopicConnectionFactory」と入力します。
パブリッシュ・ターゲット: 「jms/demoTopic」と入力します。
フィルタ: 空白のままにします。
有効化: このオプションを選択します。
「センサー・アクションの作成」ダイアログで、「OK」をクリックします。 「センサー・アクションの選択」ダイアログに、「InstanceStart」センサー・アクションが表示されます。
「センサー・アクションの選択」で、「OK」 をクリックします。 「アクティビティ・センサーの作成」ダイアログに戻ります。このダイアログは次のように表示されます。
「アクティビティ・センサーの作成」ダイアログで、「OK」をクリックします。
「Receive」ダイアログの「センサー」タブは、次のように表示されます。
「Receive」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
SOAOrderBookingページは次のように表示されます。
図8-23 receiveアクティビティが表示されたSOAOrderBooking.bpelページ

センサー情報は、SOAOrderBooking¥bpelディレクトリ内の次のファイルに格納されます。
sensor.xml
sensorAction.xml
このスコープでは、注文情報をデータベースに挿入するアクティビティを作成します。 図8-24に、「InsertOrderIntoDB」スコープ用に作成するアクティビティを示します。
「InsertOrderIntoDB」スコープのアクティビティでは、データベース内のORDERS表に注文情報を書き込むために、データベース・アダプタが使用されます。 実行時に、データベース・アダプタは、第2.6.4項「データベース・アダプタのコネクション・ファクトリの作成」で設定したeis/DB/soademo接続を介して、データベースに接続します。
データベース・アダプタを作成する手順は、次のとおりです。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Database Adapter」アイコンをドラッグして、「サービス」スイムレーンにドロップします。 「アダプタ構成ウィザード」が起動します。 ようこそページで、「次へ」をクリックして続行します。
ステップ1のサービス名ページで、「サービス名」に「Order」と入力し、「次へ」をクリックします。
ステップ2のサービス接続ページで、次の操作を実行します。
接続: SOADEMOスキーマに対するデータベース接続を選択します。
JNDI名: 「eis/DB/soademo」と入力します。 これは、Oracle Application Serverでコネクション・ファクトリを作成したときに指定したJNDI位置です(第2.6.4項「データベース・アダプタのコネクション・ファクトリの作成」を参照)。
「次へ」をクリックします。
ステップ3の操作タイプ・ページで、「表に対して操作を実行」を選択し、「挿入または更新(マージ)」を選択します。 SOA Order Bookingアプリケーションで実行する必要があるのは、表の行の挿入のみです。
「次へ」をクリックします。
ステップ4の表の選択ページで、「表のインポート」をクリックします。
「表のインポート」ダイアログで、「問合せ」をクリックします。
「ORDERS」と「ITEMS」を選択し、右矢印ボタンをクリックして「選択済」ボックスに移動します。 データベース・アダプタによって、これらの表に情報が書き込まれます。
「表のインポート」ダイアログで、「OK」をクリックします。 ステップ4の表の選択ページは、次のように表示されます。
「SOADEMO.ORDERS」を選択し、「次へ」をクリックします。
ステップ5のリレーションシップ・ページで、「次へ」をクリックします。
終了ページで、「終了」をクリックします。
「パートナ・リンクの作成」ダイアログが表示され、各フィールドは次のように表示されます。
「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。 「サービス」スイムレーンに「Orders」データベース・アダプタが表示されていることを確認します。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
ウィザードによって、SOAOrderBookingディレクトリに次のファイルが作成されます。
bpel¥DBAdapterOutboundHeader.wsdl: このファイルには、データベースに接続するための汎用情報が格納されます。
bpel¥Order.wsdl: このファイルには、ウィザードで指定した情報が格納されます。
bpel¥Order_table.xsd: このファイルには、ORDERS表とITEMS表のスキーマ情報が格納されます。
bpel¥Order_toplink_mappings.xml: このファイルはTopLinkによって使用されます。
src¥Order¥Orders.java
src¥Order¥Items.java
database¥SOADEMO¥ORDERS.table
database¥SOADEMO¥ITEMS.table
toplink¥Order¥Order.mwp
注文情報をデータベース内のORDERS表に挿入するには、そのデータベースから注文IDを取得する必要があります。 注文IDは、データベース順序から生成されます。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Database Adapter」アイコンをドラッグして、「サービス」スイムレーンにドロップします。 「アダプタ構成ウィザード」が起動します。 ようこそページで、「次へ」をクリックして続行します。
ステップ1のサービス名ページで、「サービス名」に「OrderSequence」と入力し、「次へ」をクリックします。
ステップ2のサービス接続ページで、次の操作を実行します。
接続: SOADEMOスキーマに対するデータベース接続を選択します。
JNDI名: 「eis/DB/soademo」と入力します。 これは、Oracle Application Serverでコネクション・ファクトリを作成したときに指定したJNDI位置です(第2.6.4項「データベース・アダプタのコネクション・ファクトリの作成」を参照)。
「次へ」をクリックします。
ステップ3の操作タイプ・ページで、「カスタムSQLの実行」を選択します。
「次へ」をクリックします。
ステップ4のカスタムSQLページで、「SQL」ボックスに次のSQL文を入力します。
select order_seq_id_gen.nextval from dual
ウィザードによって、適切な文が「XSD」ボックスに表示されます。
「次へ」をクリックします。
終了ページで、「終了」をクリックします。
「パートナ・リンクの作成」ダイアログが表示され、各フィールドは次のように表示されます。
図8-36 「OrderSequence」データベース・アダプタに関する「パートナ・リンクの作成」ダイアログ

「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。 「サービス」スイムレーンに「OrderSequence」データベース・アダプタが表示されていることを確認します。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
ウィザードによって、SOAOrderBookingディレクトリに次のファイルが作成されます。
bpel¥OrderSequence.wsdl: このファイルには、ウィザードで指定した情報が格納されます。
bpel¥OrderSequence.xsd: このファイルには、順序の入力および出力のフォーマットが定義されます。
「InsertOrderIntoDB」という新規スコープを作成し、データベースに注文情報を書き込むためのアクティビティを含めます。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Scope」アイコンをドラッグして、「receiveInput」アクティビティと「callbackClient」アクティビティの間にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「Scope」ダイアログの「一般」タブで、次の操作を実行します。
名前: 「InsertOrderIntoDB」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープに対して、orderRequest、orderSequenceInput、orderSequenceOutputの3つの変数を作成する必要があります。
orderRequest変数を作成する手順は、次のとおりです。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「orderRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「Order」→「Order.wsdl」→「メッセージ・タイプ」→「OrdersColllection_msg」の順に選択します。
「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://xmlns.oracle.com/pcbpel/adapter/db/Order/}OrdersCollection_msg」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。 「Scope」ダイアログに戻ります。
orderSequenceInput変数を作成する手順は、次のとおりです。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「orderSequenceInput」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「OrderSequence」→「OrderSequence.wsdl」→「メッセージ・タイプ」→「OrderSequenceInput_msg」の順に選択します。
「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://xmlns.oracle.com/pcbpel/adapter/db/OrderSequence/}OrderSequenceInput_msg」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。 「Scope」ダイアログに戻ります。
orderSequenceOutput変数を作成する手順は、次のとおりです。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「orderSequenceOutput」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「OrderSequence」→「OrderSequence.wsdl」→「メッセージ・タイプ」→「OrderSequenceOutputCollection_msg」の順に選択します。
「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://xmlns.oracle.com/pcbpel/adapter/db/OrderSequence/}OrderSequenceOutputCollection_msg」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。 「Scope」ダイアログに戻ります。 ダイアログに3つの変数がすべて表示されていることを確認します。
「Scope」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このinvokeアクティビティでは、order_seq_id_genデータベース順序から次の順序の値が取得され、orderSequenceOutput変数に格納されます。
「InsertOrderIntoDB」スコープを開きます。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「InsertOrderIntoDB」スコープにドロップします。
次のいずれかを実行して、「Invoke」ダイアログを表示します。
「Invoke_1」アクティビティの横にある矢印のいずれかをドラッグして、「OrderSequence」データベース・アダプタにドロップします。 invokeアクティビティがデータベース・アダプタに関連付けられます。
新規の「Invoke_1」アクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「GetOrderId」と入力します。
パートナ・リンク: 「OrderSequence」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「OrderSequence」を選択します。
図8-44 「InsertOrder」invokeアクティビティに関する「パートナ・リンクの選択」

「パートナ・リンクの選択」で、「OK」 をクリックします。
Operation: 「OrderSequence」を選択します。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「プロセス」→「変数」→「Scope - InsertOrderIntoDB」→「変数」→「orderSequenceInput」の順に選択します。
図8-45 「GetOrderId」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
出力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「プロセス」→「変数」→「Scope - InsertOrderIntoDB」→「変数」→「orderSequenceOutput」の順に選択します。
図8-46 「GetOrderId」invokeアクティビティの出力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-47 「GetOrderId」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
SOAOrderBooking.bpelページが次のように表示されていることを確認します。
このassignアクティビティでは、データベースに挿入する2つの値を準備します。
order_seq_id_genデータベース順序を起動して注文IDを取得します。
注文ステータスを「pending」に設定します。
これらの値は、「InsertOrder」invokeアクティビティによって、注文情報がデータベースに書き込まれるときに使用されます。
このassignアクティビティを作成する手順は、次のとおりです。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「InsertOrderIntoDB」スコープの「GetOrderId」アクティビティの下にドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignOrderStatus」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックし、2つのコピー操作を作成します。1つは注文IDをコピーする操作、もう1つは注文ステータスをコピーする操作です。
注文IDをコピーするコピー操作を作成する手順は、次のとおりです。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - InsertOrderIntoDB」→「変数」→「orderSequenceOutput」→「OrderSequenceOutputCollection」→「ns4:OrderSequenceOutputCollection」→「ns4:OrderSequenceOutput」→「ns4:order_seq_id_gen.nextval」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:ID」の順に選択します。
図8-49 「AssignOrderStatus」assignアクティビティの注文IDをコピーする操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
注文ステータスをコピーするコピー操作を作成する手順は、次のとおりです。
「作成」ドロップダウンから「コピー操作」を再度選択して、2番目のコピー操作を作成します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「式」に設定し、「式」ボックスに次の行を入力します。
string('pending')
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:OrderInfo」→「ns1:OrderStatus」の順に選択します。
図8-50 「AssignOrderStatus」assignアクティビティの注文ステータスをコピーする操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに2つのコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-51 「AssignOrderStatus」アクティビティに関する「Assign」ダイアログ

「ファイル」→「保存」の順に選択して、作業内容を保存します。
SOAOrderBooking.bpelページが次のように表示されていることを確認します。
この変換サービスでは、TransformOrder.xslというファイルを作成して、受信注文情報を、データベースへの挿入を準備するOrder_table.xsdに定義されているスキーマにマップします。 Order_table.xsdは、第8.7.1項「ORDERS表に書き込むためのデータベース・アダプタの作成」で実行したアダプタ構成ウィザードで作成されています。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Transform」アイコンをドラッグして、「AssignOrderStatus」アクティビティの下にドロップします。
新規のtransformアクティビティをダブルクリックして、「Transform」ダイアログを表示します。
「Transform」ダイアログで、「一般」タブをクリックし、「名前」を「TransformOrder」に設定します。
このダイアログの「トランスフォーメーション」タブをクリックし、次の値を設定します。
ソース変数: 「inputVariable」を選択します。 「ソース・パート」が「payload」に設定されていることを確認します。
ターゲット変数: 「orderRequest」を選択します。 「ターゲット・パート」が「OrdersCollection」に設定されていることを確認します。
マッパー・ファイル: 「TransformOrder.xsl」と入力し、「マッピングの作成」アイコン(中央のアイコン)をクリックします。 TransformOrder.xsl用のデータ・マッピング・ツールが表示されます。
このデータ・マッピング・ツールで、表8-2に示す簡単なマッピングを作成します。 左の列はソース側、右の列はターゲット側を示します。 この簡単なマッピングは、ソース側のラベルをターゲット側にドラッグ・アンド・ドロップすることによって作成します。
表8-2 簡単なマッピング
| ソース → client:SOAOrderBookingProcessRequest → po:PurchaseOrder | ターゲット → OrdersCollection → Orders |
|---|---|
|
po:CustID |
custid |
|
po:ID |
ordid |
|
po:OrderInfo → po:OrderDate |
orderdate |
|
po:OrderInfo → po:OrderPrice |
price |
|
po:OrderInfo → po:OrderStatus |
status |
図8-53に、簡単なマッピングを実行したデータ・マッパーを示します。
図8-53 「InsertOrderIntoDB」スコープのtransformアクティビティ用のデータ・マッパー

XSLファイルにfor-each要素を作成して、注文内のすべての品目を処理します。手順は次のとおりです。
a. データ・マッパーのコンポーネント・パレットのドロップダウンから、XSLT Constructsを選択します。
b. ターゲット側で、「itemsCollection」および「Items」を開きます。
c. コンポーネント・パレットから「for-each」品目をドラッグして、「Items」にドロップします。 「for-each」ラベルが、ターゲット側の「itemsCollection」と「Items」の間に表示されるようにします。
d. ソース側の「po:OrderItems」を開いて、その下に「po:Item」が表示されるようにします。 同様に「po:Item」も開きます。
e. ソース側の「po:Item」からの線を、ターゲット側の「for-each」品目までドラッグします。
f. 次の各品目のフィールドをマップします。
表8-3 「for-each」品目に対するマッピング
| ソース → client:SOAOrderBookingProcessRequest → po:PurchaseOrder → po:OrderItems→po:Item | ターゲット → OrdersCollection → Orders → itemsCollection → for-each → Items |
|---|---|
|
po:ProductName |
productname |
|
po:partnum |
partnum |
|
po:price |
price |
|
po:Quantity |
quantity |
ターゲット側の「itemid」については、position()関数にマップする必要があります。 データ・マッパーでこのマップを実行する手順は、次のとおりです。
コンポーネント・パレットのドロップダウンから、「Node-set Functions」を選択します。
b. コンポーネント・パレットから「position」品目をドラッグして、中間の領域(ソース領域とターゲット領域の間)にドロップします。
c. ターゲット側の「itemid」からの線を、中間の領域にある「position」品目までドラッグします。
d. 「ファイル」→「保存」の順に選択してTransformOrder.xslを保存します。
図8-54に、データ・マッパーの完了したトランスフォーメーションを示します。
図8-54 transformationアクティビティの完了したマッピングが表示されたデータ・マッパー

e. 「ファイル」→「閉じる」の順に選択して、TransformOrder.xslを閉じます。 JDeveloperのメイン・エディタに戻ります。
メイン・エディタで「ファイル」→「保存」の順に選択して、SOAOrderBooking.bpelを保存します。
このinvokeアクティビティでは、データがデータベースに挿入されます。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「TransformOrder」アクティビティの下にドロップします。
次のいずれかを実行して、「Invoke」ダイアログを表示します。
「Invoke_1」アクティビティの横にある矢印のいずれかをドラッグして、「Order」データベース・アダプタにドロップします。 「Invoke_1」アクティビティがデータベース・アダプタに関連付けられます。
新規の「Invoke_1」アクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「InsertOrder」と入力します。
パートナ・リンク: 「Order」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「Order」を選択します。
図8-55 「InsertOrder」invokeアクティビティに関する「パートナ・リンクの選択」

「パートナ・リンクの選択」で、「OK」 をクリックします。
Operation: 「write」を選択します。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - InsertOrderIntoDB」→「変数」→「orderRequest」の順に選択します。
図8-56 「InsertOrder」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-57 「InsertOrder」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
SOAOrderBooking.bpelプロジェクトが次のように表示されていることを確認します。
最小化するには、「InsertOrderIntoDB」スコープの「-」アイコンをクリックします。 最小化すると、最小化したスコープと同じレベルの新規スコープを作成しやすくなります。 最小化しないと、既存のスコープ内に誤って新規スコープをドラッグ・アンド・ドロップする可能性があります。 最小化したスコープがどのように表示されるかは、図8-1を参照してください。
このスコープでは、顧客に関する情報を取得するCustomerServiceサービスが起動されます。 戻された情報を変数に移入するために、assignアクティビティが使用されます。
図8-59に、「CustomerService」スコープのアクティビティを示します。
「CustomerService」パートナ・リンクによって、SOAOrderBookingプロジェクトは、Oracle Application ServerにデプロイされているCustomerServiceサービスと通信できるようになります。 CustomerSvc.wsdlファイルには、CustomerServiceに対するWSDLを戻すURLが含まれています。
次のファイルを、soademo_101310_prod.zipファイルからSOAOrderBooking¥bpelディレクトリにコピーします。
CustomerSvc.wsdl
soademo_101310_prod.zipファイルでは、CustomerSvc.wsdlファイルはSOAOrderBooking¥bpelディレクトリにあります。
CustomerSvc.wsdlファイル内のURLを検証します。
JDeveloperで、「ファイル」→「開く」の順に選択し、CustomerSvc.wsdlファイルを開きます。
エディタの下部にある「ソース」タブをクリックし、ファイル内の行を表示します。
ファイル内のhttp://localhost:8888参照は、Oracle Application ServerがJDeveloperと同じマシン上で実行され、そのOracle Application Serverがポート8888でリクエストをリスニングしていることを前提としています。
必要に応じて、localhostをOracle Application Serverを実行しているマシンの名前に変更し、8888をOracle Application Serverインストールで使用する正しいポートに変更します(例: mypc.mydomain.com:8889)。
ファイルを編集した場合は、そのファイルを保存して閉じます。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Partner Link」アイコンをドラッグして、「サービス」スイムレーンにドロップします。
「パートナ・リンクの作成」ダイアログで、次の操作を実行します。
名前: 「CustomerService」と入力します。
WSDLファイル: 「サービス・エクスプローラ」アイコン(左から2番目)をクリックし、「サービス・エクスプローラ」ダイアログを表示します。 「サービス・エクスプローラ」ダイアログで、「プロジェクトのWSDLファイル」を開き、「CustomerSvc.wsdl」を選択します。
図8-60 「CustomerService」パートナ・リンクに関する「サービス・エクスプローラ」

「サービス・エクスプローラ」で、「OK」をクリックします。
パートナ・リンク・タイプ: 「CustomerService_PL」を選択します(自動的に表示されます)。
パートナ・ロール: 「CustomerService_Role」を選択します。
マイ・ロール: 空白のままにします。
「パートナ・リンクの作成」ダイアログが次のように表示されていることを確認します。
図8-61 「CustomerService」パートナ・リンクに関する「パートナ・リンクの作成」ダイアログ

「OK」をクリックする前に、「名前」が「CustomerService」であることを確認します。 JDeveloperによって「CustomerSvc」に変更されている場合があります。 「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。
「CustomerService」という新規のスコープを作成します。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Scope」アイコンをドラッグして、「InsertOrderIntoDB」スコープの下にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「Scope」ダイアログの「一般」タブで、次の操作を実行します。
名前: 「CustomerService」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには1つの変数を作成する必要があります。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「customerServiceRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「CustomerService」→「CustomerSvc.wsdl」→「インポートしたWSDL」→「CustomerService」→「メッセージ・タイプ」→「CustomerService_findCustomerById」の順に選択します。
図8-62 「customerServiceRequest」変数に関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/customer}CustomerService_findCustomerById」に設定されます。
図8-63 「customerServiceRequest」変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、customerServiceRequest変数が表示されます。
図8-64 「変数」タブに「CustomerService」スコープが表示された「Scope」ダイアログ

「Scope」ダイアログで、「OK」をクリックします。
このassignアクティビティでは、顧客ID情報がcustomerServiceRequest変数に割り当てられます。 割当て後、この変数は「GetCustInfo」invokeアクティビティの入力変数として使用されます。
「CustomerService」スコープを開きます。
コンポーネント・パレットから「Assign」アイコンをドラッグして、「CustomerService」スコープにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignRequest」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:CustID」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - Customer Service」→「変数」→「customerServiceRequest」→「parameters」→「ns8:findCustomerById」→「ns8:custid」の順に選択します。
図8-65 「AssignRequest」アクティビティに関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、コピー操作が表示されていることを確認します。 「OK」をクリックします。
customerServiceResponse変数は、findCustomerById操作の結果を格納するために使用されます。
customerServiceResponse変数を「SOAOrderBooking」スコープに作成します。 この変数は、このBPELプロセス内のすべてのアクティビティがアクセスできるように、このレベルで作成されます。
「SOAOrderBooking」スコープをダブルクリックします。 横に表示されている「SOAOrderBooking」テキストをダブルクリックすることもできます。 「Process」ダイアログが表示されます。
「Process」ダイアログの「変数」タブで、「作成」をクリックします。 「変数の作成」ダイアログが表示されます。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「customerServiceResponse」と入力します。
タイプ: 「メッセージ・タイプ」を選択して懐中電灯アイコンをクリックします。 「タイプの選択」ダイアログが表示されます。
「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「CustomerService」→「CustomerSvc.wsdl」→「インポートしたWSDL」→「Customer Service」→「メッセージ・タイプ」→「CustomerService_findCustomerByIdResponse」の順に選択します。
図8-67 「customerServiceResponse」プロセス変数に関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」 をクリックします。 「変数の作成」ダイアログは次のように表示されます。
図8-68 「customerServiceResponse」プロセス変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。 「Process」ダイアログにcustomerServiceResponse変数が表示されます。
図8-69 customerServiceResponse変数が表示された「Process」ダイアログ

「Process」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このinvokeアクティビティは、「CustomerService」パートナ・リンクにアクセスし、findCustomerById操作を起動します。 この操作は、「AssignRequest」アクティビティで割り当てられた顧客IDを使用して起動されます。 操作の結果はcustomerServiceResponse変数に格納されます。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「AssignRequest」アクティビティの下にドロップします。
次にいずれかを実行して、「Invoke」ダイアログを表示します。
「Invoke_1」アクティビティの横にある矢印のいずれかをドラッグして、「CustomerService」パートナ・リンクにドロップします。 invokeアクティビティがパートナ・リンクに関連付けられます。
新規の「Invoke_1」アクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「GetCustInfo」と入力します。
パートナ・リンク: 「CustomerService」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「CustomerService」を選択します。
図8-70 「GetCustInfo」invokeアクティビティに関する「パートナ・リンクの選択」ダイアログ

「パートナ・リンクの選択」で、「OK」 をクリックします。
操作: 「findCustomerById」を選択します。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - CustomerService」→「変数」→「customerServiceRequest」の順に選択します。
図8-71 「GetCustInfo」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
出力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「変数」→「customerServiceResponse」の順に選択します。
図8-72 「GetCustInfo」invokeアクティビティの出力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-73 「GetCustInfo」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このassignアクティビティでは、顧客の姓名がinputVariableのペイロード部分に追加されます。 この追加操作の実行には、XMLフラグメントが使用されます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「GetCustInfo」アクティビティの下にドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignInitialCustomerResponse」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 追加操作を作成します。
「作成」ドロップダウンから「追加操作」を選択します。 「追加操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」ドロップダウンから「XMLフラグメント」を選択し、「XMLフラグメント」ボックスに次の行を入力します。
<nsx:ShipTo xmlns:nsx="http://www.globalcompany.com/ns/order"> <nsx:Name> <nsx:First/> <nsx:Last/> </nsx:Name> </nsx:ShipTo>
接頭辞nsxは、「http://www.globalcompany.com/ns/order」に対する接頭辞で置換する必要があります。 接頭辞を判別するには、SOAOrderBooking.bpelファイルの先頭までスクロールし、次の行を探します。
xmlns:prefix="http://www.globalcompany.com/ns/order"
たとえば、ファイル内の行が次のように記述されているとします。
xmlns:ns1="http://www.globalcompany.com/ns/order"
この場合は、XMLフラグメントで接頭辞をns1に変更する必要があります。
「To」側で、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」の順に選択します。
図8-74 「AssignInitialCustomerResponse」アクティビティに関する「追加操作の作成」ダイアログ

「追加操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、追加操作が表示されていることを確認します。
図8-75 「AssignInitialCustomerResponse」アクティビティに関する「Assign」ダイアログ

「Assign」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このアクティビティでは、(データベースから取得された)顧客の姓名がinputVariableに割り当てられます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「AssignInitialCustomerResponse」アクティビティの下にドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignCustomerResponse」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 2つのコピー操作を作成します。
1番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「customerServiceResponse」→「parameters」→「ns8:findCustomerByIdResponse」→「ns8:return」→「ns8:fname」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:ShipTo」→「ns1:Name」→「ns1:First」の順に選択します。
図8-76 「AssignCustomerResponse」アクティビティに関する「コピー操作の作成」ダイアログ、1番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
2番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を再度選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「customerServiceResponse」→「parameters」→「ns8:findCustomerByIdResponse」→「ns8:return」→「ns8:lname」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:ShipTo」→「ns1:Name」→「ns1:Last」の順に選択します。
図8-77 「AssignCustomerResponse」アクティビティに関する「コピー操作の作成」ダイアログ、2番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに2つのコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-78 「AssignCustomerResponse」アクティビティに関する「Assign」ダイアログ

「ファイル」→「保存」の順に選択して、作業内容を保存します。
このスコープでは、顧客の与信が検証されます。 顧客が与信の審査に合格しなかった場合は、フォルトがスローされ、フローの残りの部分は続行されません。
図8-79に、「CreditService」スコープのアクティビティを示します。
「CreditService」スコープでは、第5章「CreditServiceプロジェクトの作成」で作成したCreditServiceが使用されます。 「CreditValidatingService」パートナ・リンクはCreditServiceへのインタフェースです。
次のファイルを、soademo_101310_prod.zipファイルからSOAOrderBooking¥bpelディレクトリにコピーします。
CreditValidatingService.wsdl
soademo_101310_prod.zipファイルでは、CreditValidatingService.wsdlファイルはSOAOrderBooking¥bpelディレクトリにあります。
CreditValidatingService.wsdlファイル内のURLを検証します。
JDeveloperで、「ファイル」→「開く」の順に選択し、CreditValidatingService.wsdlファイルを開きます。
エディタの下部にある「ソース」タブをクリックし、ファイル内の行を表示します。
ファイル内のhttp://localhost:8888参照は、Oracle Application ServerがJDeveloperと同じマシン上で実行され、そのOracle Application Serverがポート8888でリクエストをリスニングしていることを前提としています。
必要に応じて、localhostをOracle Application Serverを実行しているマシンの名前に変更し、8888をOracle Application Serverインストールで使用する正しいポートに変更します(例: mypc.mydomain.com:8889)。
ファイルを編集した場合は、そのファイルを保存して閉じます。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Partner Link」アイコンをドラッグして、「サービス」スイムレーンにドロップします。
「パートナ・リンクの作成」ダイアログで、次の操作を実行します。
名前: 「CreditValidatingService」と入力します。
WSDLファイル: 「サービス・エクスプローラ」アイコン(左から2番目)をクリックし、「サービス・エクスプローラ」ダイアログを表示します。 「サービス・エクスプローラ」ダイアログで、「プロジェクトのWSDLファイル」を開き、「CreditValidatingService.wsdl」を選択します。
図8-80 「CreditValidatingService」パートナ・リンクに関する「サービス・エクスプローラ」ダイアログ

「サービス・エクスプローラ」で、「OK」をクリックします。
パートナ・リンク・タイプ: 「ValidateCreditCard_PL」を選択します(自動的に表示されます)。
パートナ・ロール: 「ValidateCreditCard_Role」を選択します。
マイ・ロール: 空白のままにします。
「パートナ・リンクの作成」ダイアログが次のように表示されていることを確認します。
図8-81 「CreditValidatingService」パートナ・リンクに関する「パートナ・リンクの作成」

「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。
「CreditService」という新規のスコープを作成します。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Scope」アイコンをドラッグして、「CustomerService」スコープの下にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「Scope」ダイアログの「一般」タブで、次の操作を実行します。
名前: 「CreditService」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには2つの変数を作成する必要があります。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「validateRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「CreditValidatingService」→「CreditValidatingService.wsdl」→「インポートしたWSDL」→「ValidateCreditCardServiceSoapHttp」→「メッセージ・タイプ」→「CreditCardValidationRequestMessage」の順に選択します。
「タイプの選択」で、「OK」 をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/credit}CreditCardValidationRequestMessage」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。
「作成」を再度クリックして、2番目の変数を作成します。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「validateResponse」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「CreditValidatingService」→「CreditValidatingService.wsdl」→「インポートしたWSDL」→「ValidateCreditCardServiceSoapHttp」→「メッセージ・タイプ」→「CreditCardValidationResponseMessage」の順に選択します。
「タイプの選択」で、「OK」 をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/credit}CreditCardValidationResponseMessage」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、validateRequestおよびvalidateResponse変数が表示されます。
「Scope」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このassignアクティビティでは、(CustomerServiceのfindCustomerById操作から取得された)クレジット・カード番号およびタイプがvalidateRequest変数にコピーされます。
「CreditService」スコープを開きます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「CreditService」スコープにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「InitializeRequest」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 2つのコピー操作を作成します。
1番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「customerServiceResponse」→「parameters」→「ns8:findCustomerByIdResponse」→「ns8:return」→「ns8:creditcardnumber」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - Credit Service」→「変数」→「validateRequest」→「CreditCard」→「ns11:CreditCard」→「ccNum」の順に選択します。
図8-87 「InitializeRequest」アクティビティに関する「コピー操作の作成」ダイアログ、1番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
2番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を再度選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「customerServiceResponse」→「parameters」→「ns8:findCustomerByIdResponse」→「ns8:return」→「ns8:creditcardtype」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - Credit Service」→「変数」→「validateRequest」→「CreditCard」→「ns11:CreditCard」→「ccType」の順に選択します。
図8-88 「InitializeRequest」アクティビティに関する「コピー操作の作成」ダイアログ、2番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、複数のコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-89 「InitializeRequest」アクティビティに関する「Assign」ダイアログ

このinvokeアクティビティでは、顧客のクレジット・カードが有効であるかどうかが確認されます。 前述のassignアクティビティで割り当てた値が使用されます。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「InitializeRequest」アクティビティの下にドロップします。
次にいずれかを実行して、「Invoke」ダイアログを表示します。
「Invoke_1」アクティビティの横にある矢印矢印のいずれかをドラッグして、「CreditValidatingService」パートナ・リンクにドロップします。 invokeアクティビティがパートナ・リンクに関連付けられます。
新規の「Invoke_1」アクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「InvokeCreditService」と入力します。
パートナ・リンク: 「CreditValidatingService」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「CreditValidatingService」を選択します。
図8-90 「InvokeCreditService」アクティビティに関する「パートナ・リンクの選択」

「パートナ・リンクの選択」で、「OK」 をクリックします。
操作: 「VerifyCC」を選択します(自動的に表示されます)。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - CreditService」→「変数」→「validateRequest」の順に選択します。
図8-91 「InvokeCreditService」アクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
出力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - CreditService」→「変数」→「validateResponse」の順に選択します。
図8-92 「InvokeCreditService」アクティビティの出力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-93 「InvokeCreditService」アクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
OrderBookingFault変数を「SOAOrderBooking」スコープに作成します。 この変数は、このBPELフロー内のすべてのアクティビティがアクセスできるように、このレベルで作成されます。
ページの上部にスクロールし、「SOAOrderBooking」スコープをダブルクリックします。 横に表示されている「SOAOrderBooking」テキストをダブルクリックすることもできます。 「Process」ダイアログが表示されます。
「Process」ダイアログの「変数」タブで、「作成」をクリックします。 「変数の作成」ダイアログが表示されます。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「OrderBookingFault」と入力します。
タイプ: 「メッセージ・タイプ」を選択して懐中電灯アイコンをクリックします。 「タイプの選択」ダイアログが表示されます。
「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「client」→「SOAOrderBooking.wsdl」→「メッセージ・タイプ」→「SOAOrderBookingFaultMessage」の順に選択します。
図8-94 「OrderBookingFault」プロセス変数に関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」 をクリックします。 「変数の作成」ダイアログは次のように表示されます。
図8-95 「OrderBookingFault」プロセス変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。 「Process」ダイアログにOrderBookingFault変数が表示されます。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このスイッチでは、「InvokeCreditService」invokeアクティビティの結果が確認されます。 顧客のクレジット・カードが有効な場合、フローは続行されます。 顧客のクレジット・カードが有効でない場合は、フォルトがスローされます。
コンポーネント・パレットから「Switch」アイコンをドラッグして、「InvokeCreditService」アクティビティの下にドロップします。
switchアクティビティを開きます。
<otherwise>ケースを削除します。 このスイッチでは無効な与信レスポンスのみが処理され、この場合はフォルトがスローされます。 スイッチは有効なクレジット・カードに対しては適用されず、この場合はフローの次のステップが続行されます。
<case>ブランチについては、顧客の与信が有効でない場合を処理する必要があります。 この情報はvalidateResponse変数に格納されます。
<case>ボックスのタイトル・バーをダブルクリックして、「Switch Case」ダイアログを表示します。
「Switch Case」ダイアログで、「式」ボックスの上にある「XPath式ビルダー」アイコンをクリックし、「式ビルダー」ダイアログを表示します。
「式ビルダー」ダイアログの「BPEL変数」ボックスで、「変数」→「プロセス」→「Scope - CreditService」→「変数」→「validateResponse」→「valid」→「ns11:valid」の順に選択します。
「コンテンツのプレビュー」ボックスに、「bpws:getVariableData('validateResponse', 'valid', 'ns11:valid')」が表示されていることを確認します。
接頭辞ns11は、「http://www.globalcompany.com/ns/credit.xsd」ネームスペースにマップされます。 この接頭辞はシステムによって異なる場合があります。 接頭辞を確認するには、必要に応じて、ソース・ビューでSOAOrderBooking.bpelファイルの先頭までスクロールできます。
「式に挿入」をクリックします。 「式」ボックスに、関数が3つのパラメータとともに表示さていることを確認します。
次のような式になるように、「='false'」を「式」ボックスの式に追加します。
bpws:getVariableData('validateResponse','valid','/ns11:valid')='false'
「式ビルダー」ダイアログで、「OK」をクリックします。
「Switch Case」ダイアログで、「OK」をクリックします。
このassignアクティビティでは、OrderBookingFault変数の値が「credit problem」に設定されます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、スイッチの<case>領域にドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignFault」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 1つのコピー操作を作成します。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「式」に設定し、「式」ボックスに次の行を入力します。
string('credit problem')
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「OrderBookingFault」→「payload」→「client:SOAOrderBookingProcessFault」→「client:status」の順に選択します。
「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、コピー操作が表示されていることを確認します。 「OK」をクリックします。
このthrowアクティビティでは、OrderBookingFaultというフォルトがスローされます。 このフォルト値は、同じ名前のOrderBookingFaultという変数に格納されます。 SOAOrderBookingプロセスは、throwアクティビティの実行後に終了します。
コンポーネント・パレットから「Throw」アイコンをドラッグして、「AssignFault」アクティビティの下にドロップします。
新規のthrowアクティビティをダブルクリックして、「Throw」ダイアログを表示します。
「Throw」ダイアログで、次の操作を実行します。
名前: 「ThrowCreditFault」と入力します。
ネームスペースURI: 「http://www.globalcompany.com/ns/OrderBooking」と入力します。 これは手動で入力する必要があります。
ローカル・パート: 「OrderBookingFault」と入力します。 これは手動で入力する必要があります。
フォルト変数: 懐中電灯アイコンをクリックして「OrderBookingFault」を選択します。
図8-100 「ThrowCreditFault」throwアクティビティに関する「Throw」ダイアログ

「Throw」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
Oracle Business Rulesのリポジトリには、Oracle BPEL Process Managerのデシジョン・サービスによって使用されるルールが格納されています。このルールによって、注文をマネージャが手動で承認する必要があるかどうかが判別されます。 このOracle Business Rulesのリポジトリは、SOA Order Bookingアプリケーションから分離されています。このため、SOA Order Bookingアプリケーションを変更および再デプロイせずにルールを編集できます。
リポジトリ内に作成するルールは、次のとおりです。
顧客のステータスが「platinum」の場合、注文金額に関係なく、マネージャの承認は必要ありません。
注文の合計金額が$1000以上で、かつ顧客のステータスが「platinum」ではない場合は、マネージャの承認が必要です。
注文の合計金額が$1000未満の場合、マネージャの承認は必要ありません。
Oracle Business Rulesのリポジトリ・ファイルを作成し、その中にルールを定義するには、Oracle Business Rules Rule Author(Rule Author)を使用します。このRule Authorは、Oracle Business Rulesのリポジトリを作成および管理できるWebベースのツールです。
リポジトリ・ファイルの位置
リポジトリ・ファイルはSOAOrderBooking¥bpel¥rules¥oracleディレクトリに作成します。
ただし、JDeveloperとOracle Application Serverを別々のマシンで実行している場合は、リポジトリ・ファイルをOracle Application Serverマシンに作成する必要があります(Rule AuthorではOracle Application Serverのマシンにファイルが作成されるため)。 リポジトリ・ファイルを作成し、その中にルールを移入した後は、そのリポジトリ・ファイルをOracle Application ServerマシンからJDeveloperマシンにコピーします。
SOA Order Bookingアプリケーションを作成している場所に、次のディレクトリを作成します。
SOADEMO¥SOAOrderBooking¥bpel¥rules¥oracle¥
これは、Oracle Business Rulesのリポジトリ・ファイルを配置するディレクトリです。
ブラウザで、Rule Authorのページを開きます。 Rule AuthorのURLは、次のとおりです。
http://host:port/ruleauthor
hostは、Oracle Application Serverを実行しているマシンを、portは、HTTPポート(例: 8888)を指定します。
oc4jadminユーザーでログインします。
「リポジトリ」タブで、次の操作を実行します。
リポジトリ・タイプ: 「ファイル」を選択します。
ファイルの場所: 「SOADEMO¥SOAOrderBooking¥bpel¥rules¥oracle¥sample_repository」と入力します(SOADEMOは、SOA Order Bookingアプリケーションを作成しているディレクトリを表します)。 Rule Authorによってsample_repositoryファイルが作成されます。
JDeveloperとOracle Application Serverを別々のマシンで実行している場合は、Oracle Application Serverマシンのパスを入力します(例: C:¥rules¥sample_repository)。 格納する場所はどこでもかまいません。これは、ファイルを作成し、その中にルールを定義した後で、そのファイルをOracle Application Serverマシンから、JDeveloperマシンのSOADEMO¥SOAOrderBooking¥bpel¥rules¥oracle¥ディレクトリにコピーするためです。
「作成」をクリックします。 確認ページが表示されていることを確認します。 これで、Rule Authorが新規リポジトリに接続され、このリポジトリ内にルールを定義できます。
リポジトリには1つ以上のディクショナリが格納されます。 ディクショナリには複数のルールセットが含まれ、各ルールセットには複数のルールが含まれています。 通常、1つのディクショナリには、1つのアプリケーションに対する複数のルールセットが含まれています。
確認ページの「作成」セカンダリ・タブをクリックします。 ディクショナリを作成ページが表示されます。
ディクショナリを作成ページで、ディクショナリ名として「OrderBookingRules」と入力します。
「作成」をクリックします。 確認ページが表示されていることを確認します。
このステップは、JDeveloperとOracle Application Serverを別々のマシンで実行している場合のみ必要です。 両方を同じマシンで実行している場合、OrderBookingRules.xsdファイルは、(第8.3項「ファイルのコピー」でファイルをコピーした)Oracle Application Serverマシンにすでに存在しています。
soademo_101310_prod.zipファイル内のOrderBookingRules.xsdファイルには、Oracle Business Rulesに関するファクトを提供するXML要素が記述されています。 XSDファイルは、zipファイル内のSOAOrderBooking¥bpelディレクトリにあります。
JDeveloperとOracle Application Serverを別々のマシンで実行している場合は、このファイルをsoademo_101310_prod.zipファイルから、Oracle Application Serverマシンのリポジトリ・ファイルを格納したディレクトリ(例: C:¥rules)にコピーします。 手順4を参照してください。
第8.10.4項「XMLスキーマ内の要素に対するJAXBクラスの生成」で、Rule Authorを使用して、OrderBookingRules.xsdに定義されているXML要素に対してJavaクラスを生成します。
OrderBookingRules.xsdファイル内の要素に対してJavaオブジェクトを生成するには、Rule Authorを使用します。
「定義」タブをクリックして、左側の「XMLFact」をクリックします。 XMLファクト・サマリー・ページが表示されます。 この時点で、OrderBookingRulesディクショナリにXMLファクトは含まれていません。
「作成」をクリックします。
XMLスキーマ・セレクタ・ページで、次の操作を実行します。
XMLスキーマ: OrderBookingRules.xsdファイルへのフルパスを入力します。
JDeveloperとOracle Application Serverを同じマシンで実行している場合は、「SOADEMO¥SOAOrderBooking¥bpel¥OrderBookingRules.xsd」と入力します。
JDeveloperとOracle Application Serverを別々のマシンで実行している場合は、「C:¥rules¥OrderBookingRules.xsd」と入力します。
JAXBクラス・ディレクトリ: Rule AuthorでJavaオブジェクト(.javaおよび.classファイル)を作成するディレクトリへのフルパスを入力します。
JDeveloperとOracle Application Serverを同じマシンで実行している場合は、「SOADEMO¥SOAOrderBooking¥bpel¥rules」と入力します。
JDeveloperとOracle Application Serverを別々のマシンで実行している場合は、「C:¥rules」と入力します。
ターゲット・パッケージ名: 「com.oracle.demos.orderbooking」と入力します。 作成されるクラスのパッケージ名を指定します。
「スキーマの追加」をクリックします。
図8-107に、パッケージ階層を開いた状態の結果ページを示します。
「JAXBクラス・ディレクトリ」フィールドで指定したディレクトリに、次のファイルが存在していることを確認します。
Approve.javaおよびApprove.class
ApproveImpl.javaおよびApproveImpl.class
ApproveType.javaおよびApproveType.class
ApproveTypeImpl.javaおよびApproveTypeImpl.class
jaxb.properties
ObjectFactory.javaおよびObjectFactory.class
JAXBクラスを生成した後は、そのクラスをOracle Business Rulesデータ・モデルにインポートできます。 これらのJAXBクラスは、ルールの作成時に使用できるXMLファクトになります。
XMLスキーマ・セレクタ・ページが表示されていない場合は、「定義」タブをクリックし、左側の「XMLFact」をクリックします。次に、XMLファクト・サマリー・ページで「作成」をクリックします。
「com」の横にあるチェック・ボックスを選択します。
「インポート」をクリックします。 確認ページが表示されていることを確認します。 インポートしたクラスは太字で表示されます。 左側にも、現在3つのXMLファクトがあることに注意してください。
データ・モデルに変数を定義すると、後で変更が必要な場合に、その変数の値を編集するのみで対応できます。 SOA Order Bookingアプリケーションの場合は、AUTOMATED_ORDER_LIMITという変数を作成して金額を定義します。この金額以上の注文にはマネージャによる手動の承認が必要であり、この金額未満の注文は自動的に承認されます。
「定義」タブで、左側の「変数」をクリックします。
変数サマリー・ページで、「作成」をクリックします。
変数ページで、次の操作を実行します。
名前: 「AUTOMATED_ORDER_LIMIT」と入力します。
エイリアス: 「AUTOMATED_ORDER_LIMIT」と入力します。
ファイナル: このオプションを選択します。
型: 「float」を選択します。
式: 「1000.00」と入力します。
「OK」をクリックします。 変数サマリー・ページが表示されます。 変数名に接頭辞DM(データ・モデルの略)が付加されていることに注意してください。
ルールセットには、複数のルールが含まれています。 ルールを作成するには、ルールセットが必要です。
「ルールセット」タブをクリックします。 ルールセット・サマリー・ページが表示されます。
ルールセット・サマリー・ページで、「作成」をクリックします。 ルールセット・ページが表示されます。
ルールセット・ページで、「名前」に「ApproveOrderRequired」と入力します。 必要な場合は説明も入力できます。
「OK」をクリックします。 ルールセット・サマリー・ページに新規ルールセットが表示されていることを確認します。 新規ルールセットは左側にも表示されます。
「ApproveOrderRequired」ルールセットにルールを定義できる状態になりました。 SOA Order Bookingアプリケーションの場合は、次の3つのルールを作成します。
表8-4 ルール
| ルール名 | 説明 |
|---|---|
|
|
注文の合計価格がAUTOMATED_ORDER_LIMIT変数に設定された値未満の場合、その注文は自動的に承認されます。 第8.10.8.1項「「belowLimit」ルールの作成」を参照してください。 |
|
|
注文の合計価格がAUTOMATED_ORDER_LIMIT変数に設定された値以上で、かつ顧客がプラチナ顧客でない場合、その注文はマネージャによる承認が必要です。 第8.10.8.2項「「overLimit」ルールの作成」を参照してください。 |
|
|
顧客がプラチナ顧客の場合、注文は金額に関係なく自動的に承認されます。 第8.10.8.3項「「platinumMember」ルールの作成」を参照してください。 |
「belowLimit」ルールは、注文の合計価格が、AUTOMATED_ORDER_LIMIT変数に設定された値未満の場合、その注文は自動的に承認されることを示します。
「ルールセット」タブをクリックします。
左側の「ApproveOrderRequired」ルールセットをクリックします。 ルールセット・ページが表示されます。
図8-114 「ApproveOrderRequired」ルールセットに関するルールセット・ページ

「ルール」セクションの「作成」をクリックします。 ルール・ページが表示されます。
ルール・ページで、「名前」に「belowLimit」と入力します。 「優先度」については、デフォルト値をそのまま使用します。
「if」セクションの「新規パターン」をクリックします。 「パターン定義」ウィンドウが表示されます。
「パターン定義」ウィンドウの「パターンの選択」セクションで、次の操作を実行します。
1番目のフィールドからは何も選択しないでください(空白のままにしてください)。
2番目のフィールドに「approve」と入力します。
ドロップダウンから「ApproveType」を選択します。
「パターンのテストを定義」セクションの「作成」をクリックします。 このセクションで、次の操作を実行します。
オペランド: 「approve.price」を選択します。
演算子: 「<」(より小さい)を選択します。
オペランド(値またはフィールドを選択): 「フィールド」の下の「AUTOMATED_ORDER_LIMIT」を選択します。 ドロップダウンからFixedを選択します。
「パターン定義」ウィンドウが次のように表示されていることを確認します。
「パターン定義」ウィンドウで、「適用」をクリックします。 「パターン定義」ウィンドウの上部に確認メッセージが表示されていることを確認します。
「OK」をクリックしてルール・ページに戻ります。このルール・ページは次のように表示されます。
ルール・ページで「適用」をクリックします。 ルール・ページの上部に確認メッセージが表示されていることを確認します。
ルール・ページの「then」セクションで、「新規アクション」をクリックします。 「アクションの追加」ウィンドウが表示されます。
「アクションの追加」ウィンドウで、次の操作を実行します。
アクション・タイプ: 「Assign」を選択します。
名前: 「approve.approvalRequired」を選択します。
式: 「false」と入力します。
「適用」をクリックします。
「OK」をクリックしてルール・ページに戻ります。このルール・ページは次のように表示されます。
「適用」をクリックします。
作業内容を保存します。 ページ上部にある「ディクショナリの保存」リンクをクリックし、ディクショナリの保存ページで「保存」をクリックします。
「overLimit」ルールは、注文の合計価格がAUTOMATED_ORDER_LIMIT変数に設定された値以上で、かつ顧客がプラチナ顧客でない場合、その注文はマネージャによる承認が必要であることを示します。 顧客がプラチナ顧客の場合、注文は金額に関係なく自動的に承認されます。
「ルールセット」タブをクリックします。
左側の「ApproveOrderRequired」ルールセットをクリックします。 ルールセット・ページが表示されます。 「belowLimit」ルールはすでに作成されています。
図8-119 「ApproveOrderRequired」ルールセットに関するルールセット・ページ

「ルール」セクションの「作成」をクリックします。 ルール・ページが表示されます。
ルール・ページで、「名前」に「overLimit」と入力します。 「優先度」については、デフォルト値をそのまま使用します。
「if」セクションの「新規パターン」をクリックします。 「パターン定義」ウィンドウが表示されます。
「パターン定義」ウィンドウの「パターンの選択」セクションで、次の操作を実行します。
1番目のフィールドからは何も選択しないでください(空白のままにしてください)。
2番目のフィールドに「approve」と入力します。
ドロップダウンから「ApproveType」を選択します。
「パターンのテストを定義」セクションの「作成」をクリックします。 このセクションで、次の操作を実行します。
オペランド: 「approve.price」を選択します。
演算子: 「>=」(以上)を選択します。
オペランド(値またはフィールドを選択): 「フィールド」の下の「AUTOMATED_ORDER_LIMIT」を選択します。 ドロップダウンからFixedを選択します。
「パターン定義」ウィンドウが次のように表示されていることを確認します。
「作成」を再度クリックして、2番目のテストを定義します。 このセクションで、次の操作を実行します。
オペランド: 「approve.status」を選択します。
演算子: 「!=」(等しくない)を選択します。
オペランド(値またはフィールドを選択): 「値」の下に「"Platinum"」(二重引用符も入力)と入力します。 ドロップダウンからFixedを選択します。
「パターン定義」ウィンドウが次のように表示されていることを確認します。
「パターン定義」ウィンドウで、「適用」をクリックします。 「パターン定義」ウィンドウの上部に確認メッセージが表示されていることを確認します。
「OK」をクリックしてルール・ページに戻ります。
ルール・ページは次のように表示されます。
ルール・ページで「適用」をクリックします。 ルール・ページの上部に確認メッセージが表示されていることを確認します。
ルール・ページの「then」セクションで、「新規アクション」をクリックします。 「アクションの追加」ウィンドウが表示されます。
「アクションの追加」ウィンドウで、次の操作を実行します。
アクション・タイプ: 「Assign」を選択します。
名前: 「approve.approvalRequired」を選択します。
式: 「true」と入力します。
「適用」をクリックします。
「OK」をクリックしてルール・ページに戻ります。このルール・ページは次のように表示されます。
「適用」をクリックします。
作業内容を保存します。 ページ上部にある「ディクショナリの保存」リンクをクリックし、ディクショナリの保存ページで「保存」をクリックします。
「platinumMember」ルールは、顧客がプラチナ顧客の場合は、注文が金額に関係なく自動的に承認されることを示します。
「ルールセット」タブをクリックします。
左側の「ApproveOrderRequired」ルールセットをクリックします。 ルールセット・ページが表示されます。 「belowLimit」および「overLimit」ルールはすでに作成されています。
図8-125 「ApproveOrderRequired」ルールセットに関するルールセット・ページ

「ルール」セクションの「作成」をクリックします。 ルール・ページが表示されます。
ルール・ページで、「名前」に「platinumMember」と入力します。 「優先度」については、デフォルト値をそのまま使用します。
「if」セクションの「新規パターン」をクリックします。 「パターン定義」ウィンドウが表示されます。
「パターン定義」ウィンドウの「パターンの選択」セクションで、次の操作を実行します。
1番目のフィールドからは何も選択しないでください(空白のままにしてください)。
2番目のフィールドに「approve」と入力します。
ドロップダウンから「ApproveType」を選択します。
「パターンのテストを定義」セクションの「作成」をクリックします。 このセクションで、次の操作を実行します。
オペランド: 「approve.status」を選択します。
演算子: 「==」(等しい)を選択します。
オペランド(値またはフィールドを選択): 「値」の下に「"Platinum"」(二重引用符も入力)と入力します。 ドロップダウンからFixedを選択します。
「パターン定義」ウィンドウが次のように表示されていることを確認します。
「パターン定義」ウィンドウで、「適用」をクリックします。 「パターン定義」ウィンドウの上部に確認メッセージが表示されていることを確認します。
「OK」をクリックしてルール・ページに戻ります。
ルール・ページは次のように表示されます。
ルール・ページで「適用」をクリックします。 ルール・ページの上部に確認メッセージが表示されていることを確認します。
ルール・ページの「then」セクションで、「新規アクション」をクリックします。 「アクションの追加」ウィンドウが表示されます。
「アクションの追加」ウィンドウで、次の操作を実行します。
アクション・タイプ: 「Assign」を選択します。
名前: 「approve.approvalRequired」を選択します。
式: 「false」と入力します。
「適用」をクリックします。
「OK」をクリックしてルール・ページに戻ります。このルール・ページは次のように表示されます。
「適用」をクリックします。
作業内容を保存します。 ページ上部にある「ディクショナリの保存」リンクをクリックし、ディクショナリの保存ページで「保存」をクリックします。
この項は、JDeveloperとOracle Application Serverを別々のマシンで実行している場合のみ適用されます。 両方を同じマシンで実行している場合、ファイルはすでにJDeveloperのマシンに存在しています。
Rule Authorで生成されたファイルを、Oracle Application ServerマシンからJDeveloperマシンにコピーします。
c:¥rules¥sample_repositoryファイルをSOADEMO¥SOAOrderBooking¥bpel¥rules¥oracleディレクトリにコピーします。
各ファイルをc:¥rules¥com¥oracle¥demos¥orderbookingからSOADEMO¥SOAOrderBooking¥bpel¥rules¥com¥oracle¥demos¥orderbookingディレクトリにコピーします。
このdecideアクティビティは、注文に対してマネージャの承認が必要かどうかを確認します。 この判断は、Oracle Business Rulesリポジトリのルールを確認した上で実行されます。 このルールは、第8.10項「Oracle Business Rulesの設定」で作成したルールです。
図8-130に、「RequiresManualApproval」decideアクティビティ内のアクティビティを示します。
図8-130 「RequiresManualApproval」decideアクティビティ内のアクティビティ

コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Decide」アイコンをドラッグして、「CreditService」スコープの下にドロップします。 デシジョンの編集ダイアログが表示されます。
デシジョンの編集ダイアログで、「名前」フィールドに「RequiresManualApproval」と入力します。
「デシジョン・サービス」フィールドで、棒型アイコンをクリックします。 デシジョン・サービス・ウィザードが起動します。
ステップ1のルールセットまたは関数の選択ページで、次の操作を実行します。
サービス名: 「DecisionService」(デフォルト名)と入力します。
ネームスペース: 「http://www.globalcompany.com/ns/OrderBooking/DecisionService」(デフォルト)と入力します。
起動パターン: 「ルールセットの実行」を選択します。
ルールセット: 懐中電灯アイコンをクリックし、「ルール・エクスプローラ」を表示します。 「ルール・エクスプローラ」に「sample_repository」が表示されていることを確認します。 これを開き、次に「OrderBookingRules」(ディクショナリの名前)を開いて、「ApproveOrderRequired」(ルールセットの名前)を選択します。
「ルール・エクスプローラ」で、「OK」をクリックします。
ウィザードのステップ1に戻り、承認に対して「ファクトをアサートしますか。」および「ファクトを監視しますか。」を選択します。
最上位レベル要素のすべての子をアサートするには、ここをクリックしてください。: 選択しません。
「次へ」をクリックします。
ウィザードで、ファイルがみつからないことを示す画面が表示された場合は、ウィザードが指示するファイルを必要な場所にコピーします。 この画面は、JDeveloperとOracle Application Serverを異なるマシンで実行し、Oracle Business RulesリポジトリをOracle Application ServerマシンからJDeveloperマシンにコピーした場合に表示されることがあります。
「次へ」をクリックします。
終了ページで、「終了」をクリックします。
デシジョンの編集ダイアログに戻って、次の操作を実行します。
デシジョン・サービス: 「DecisionService」に自動的に設定されます。
操作: 「ファクトのアサート、ルールセットの実行、結果の取出し」を選択します。
デシジョンの編集ダイアログは次のように表示されます。
「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
JDeveloperでは、次の項目が作成されます。
SOAOrderBooking¥decisionservicesディレクトリ
「DecisionServicePL」パートナ・リンク
「RequiresManualApproval」decideアクティビティ内の次のアクティビティ(アクティビティを表示するには「RequiresManualApproval」を開きます)
assignアクティビティ: BPEL_Var_To_Rule_Facts
assignアクティビティ: Facts_To_Rule_Service
assignアクティビティ: BPEL_Header
invokeアクティビティ: Invoke
assignアクティビティ: Rule_Service_To_Facts
assignアクティビティ: Facts_To_BPEL_Var
JDeveloperでアクティビティがこの順序で表示されない場合は、SOAOrderBooking.bpelファイルを保存して閉じます。 次に、このファイルを再度開きます。
「RequiresManualApproval」decideアクティビティの変数は、次のとおりです。
com_oracle_demos_orderbooking_Approve_i
com_oracle_demos_orderbooking_Approve_o
dsIn
dsOut
これらの変数を表示するには、「RequiresManualApproval」decideアクティビティの左側にある「(x)」アイコンをクリックします(図8-135)。 「変数」ダイアログが表示されます(図8-136)。
図8-135 赤い円で囲まれた「RequiresManualApproval」decideアクティビティの「Variable」アイコン

変数が表示されていることを確認します。
デフォルトの「BPEL_Var_To_Rule_Facts」assignアクティビティには、操作が含まれていません。 操作はユーザーが定義する必要があります。 SOA Order Bookingアプリケーションの場合は、次の2つのコピー操作を定義します。
注文合計金額をcom_oracle_demos_orderbooking_Approve_i変数にコピーします。 注文合計金額は、この変数のapprove/price要素にコピーします。
顧客のステータス(findCustomerByIdから取得)をcom_oracle_demos_orderbooking_Approve_i変数にコピーします。 顧客のステータスは、この変数のapprove/status要素にコピーします。
「BPEL_Var_To_Rule_Facts」アクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「コピー操作」タブをクリックします。 2つのコピー操作を定義します。
1番目のコピー操作では、「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「To」側で、「タイプ」を「式」に設定します。
「式」ボックスの上にある「XPath式ビルダー」アイコンをクリックし、「式ビルダー」ダイアログを表示します。 この式ビルダー使用して式を作成します。
「式ビルダー」ダイアログの「BPEL変数」ボックスで、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns4:PurchaseOrder」→「ns4:OrderInfo」→「ns4:OrderPrice」の順に選択します。
「コンテンツのプレビュー」ボックスに、bpws:getVariableData('inputVariable', 'payload', '/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:OrderInfo/ns4:OrderPrice')が表示されていることを確認します。
接頭辞ns4は、「http://www.globalcompany.com/ns/order」ネームスペースにマップされます。 この接頭辞はシステムによって異なる場合があります。 接頭辞を確認するには、必要に応じて、ソース・ビューでSOAOrderBooking.bpelファイルの先頭までスクロールできます。
「式に挿入」をクリックします。 「式」ボックスに、関数が3つのパラメータとともに表示さていることを確認します。
「式」ボックスで、bpws:getVariableData関数全体をnumber()関数でラップします。 「式」ボックスの値が次のように表示されていることを確認します。
number(bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/
ns4:OrderInfo/ns4:OrderPrice'))
「式ビルダー」ダイアログで、「OK」をクリックします。
「From」側で、「タイプ」を「Variable」に設定します。
「変数」→「プロセス」→「Scope - RequiresManualApproval」→「変数」→「com_oracle_demos_orderbooking_Approve_i」→「ns13:approve」→「ns13:price」の順に選択します。
「コピー操作の作成」ダイアログで、「OK」をクリックします。 「Assign」ダイアログに戻ります。
「作成」ドロップダウンから「コピー操作」を再度選択して、2番目のコピー操作を作成します。
「To」側で、「タイプ」を「式」に設定します。
「式」ボックスの上にある「XPath式ビルダー」アイコンをクリックし、「式ビルダー」ダイアログを表示します。 この式ビルダー使用して式を作成します。
「式ビルダー」ダイアログの「BPEL変数」ボックスで、「変数」→「プロセス」→「変数」→「customerServiceResponse」→「parameters」→「ns8:findCustomerByIdResponse」→「ns8:return」→「ns8:status」の順に選択します。
「コンテンツのプレビュー」ボックスに、bpws:getVariableData('customerServiceResponse','parameters','/ns8:findCustomerByIdResponse/ns8:return/ns8:status')が表示されていることを確認します。
接頭辞ns8は、「http://www.globalcompany.com/ns/customer」ネームスペースにマップされます。 この接頭辞はシステムによって異なる場合があります。 接頭辞を確認するには、必要に応じて、ソース・ビューでSOAOrderBooking.bpelファイルの先頭までスクロールできます。
「式に挿入」をクリックします。 「式」ボックスに、関数が3つのパラメータとともに表示さていることを確認します。
「式」ボックスで、bpws:getVariableData関数全体をstring()関数でラップします。 「式」ボックスの値が次のように表示されていることを確認します。
string(bpws:getVariableData('customerServiceResponse','parameters',
'/ns8:findCustomerByIdResponse/ns8:return/ns8:status'))
「式ビルダー」ダイアログで、「OK」をクリックします。
「From」側で、「タイプ」を「Variable」に設定します。
「変数」→「プロセス」→「Scope - RequiresManualApproval」→「変数」→「com_oracle_demos_orderbooking_Approve_i」→「ns13:approve」→「ns13:status」の順に選択します。
「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
デフォルトの「BPEL_Header」assignアクティビティには、7つのコピー操作が含まれています。 別のコピー操作を追加して、対話IDをdsIn変数にコピーします。
「BPEL_Header」アクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「コピー操作」タブをクリックします。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「式」に設定します。
「式」ボックスに次のように入力します。
ora:getConversationId()
「To」側で、「タイプ」を「Variable」に設定します。
「変数」→「プロセス」→「Scope - RequiresManualApproval」→「変数」→「dsIn」→「payload」→「ns12:assertExecuteWatchStateful」→「ns12:bpelInstance」→「ns14:conversationId」の順に選択します。
「コピー操作の作成」ダイアログで、「OK」をクリックします。 「Assign」ダイアログに戻ります。
「Assign」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
requiresApproval変数を「SOAOrderBooking」スコープに作成します。 この変数は、このBPELフロー内のすべてのアクティビティがアクセスできるように、このレベルで作成されます。
この変数は、後続の第8.12.2項「<case>に対する条件の設定」で作成するスイッチで使用します。
ページの上部にスクロールし、「SOAOrderBooking」スコープをダブルクリックします。 横に表示されている「SOAOrderBooking」テキストをダブルクリックすることもできます。 「Process」ダイアログが表示されます。
「Process」ダイアログの「変数」タブで、「作成」をクリックします。 「変数の作成」ダイアログが表示されます。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「requiresApproval」と入力します。
タイプ: 「単純型」を選択し、懐中電灯アイコンをクリックします。 「タイプの選択」ダイアログが表示されます。
「タイプの選択」で「boolean」を選択し、「OK」をクリックします。
「変数の作成」ダイアログは次のように表示されます。
図8-142 「requiresApproval」プロセス変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。 「Process」ダイアログにrequiresApproval変数が表示されます。
「Process」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
デフォルトの「Facts_To_BPEL_Var」assignアクティビティには、操作が含まれていません。 コピー操作を作成して、「DecisionService」パートナ・リンクから戻された結果をrequiresApprovalプロセス変数にコピーします。
「Facts_To_BPEL_Var」assignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「コピー操作」タブをクリックします。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定します。
「変数」→「プロセス」→「Scope - RequiresManualApproval」→「変数」→「dsOut」→「payload」→「ns12:assertExecuteWatchStatefulDecision」→「ns12:resultList」→「ns13:approve」→「ns13:approvalRequired」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定します。
「変数」→「プロセス」→「変数」→「requiresApproval」の順に選択します。
「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、コピー操作が表示されていることを確認します。 「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
手動による承認が必要な注文の場合、「requiresApproval」スイッチは、制御をhuman taskアクティビティに渡します。 これによって、マネージャは注文を承認または却下できます。
「requiresApproval」は<case>ブランチのみで構成されます。 <otherwise>ブランチはありません。 手動による承認が不要な注文の場合、このスイッチは適用されません。
<case>ブランチには、1つのhuman taskアクティビティと、もう1つのswitchアクティビティが含まれます(図8-146)。
図8-146 human taskアクティビティとswitchアクティビティが含まれた「requiresApproval」スイッチ(最小化ビュー)

図8-147に、開いた状態のhuman taskアクティビティを示します。
図8-148に、開いた状態のswitchアクティビティを示します。
図8-147 switchアクティビティ、および開いた状態のhuman taskアクティビティが表示されている<case>ブランチ

コンポーネント・パレットで、ドロップダウン・リストから「Process Activities」を選択します。
コンポーネント・パレットから「Switch」アイコンをドラッグして、「RequiresManualApproval」decideアクティビティの下にドロップします。
新規のswitchアクティビティをダブルクリックし、「Switch」ダイアログで名前を「requiresApproval」に設定します。 「OK」をクリックします。
switchアクティビティを開きます。
<otherwise>ボックスを削除します。 このスイッチの場合、処理する必要があるのは、注文に対して手動による承認が必要なケースのみです。
<case>ボックスのタイトル・バーをダブルクリックして、「Switch Case」ダイアログを表示します。
「Switch Case」ダイアログで、「式」ボックスの上にある「XPath式ビルダー」アイコンをクリックし、「式ビルダー」ダイアログを表示します。
「式ビルダー」ダイアログの「関数」ボックスで、「getVariableData」を選択します。
「コンテンツのプレビュー」ボックスに、bpws:getVariableData()が表示されていることを確認します。
最初のパラメータを関数に追加します。「BPEL変数」ボックスで、「変数」→「プロセス」→「変数」→「requiresApproval」の順に選択します。
requiresApprovalは、第8.11.4項「「requiresApproval」プロセス変数の作成」で定義したプロセス変数です。
「コンテンツのプレビュー」ボックスに、bpws:getVariableData('requiresApproval')が表示されていることを確認します。
「式に挿入」をクリックします。 「式」ボックスに、関数が1つのパラメータとともに表示されていることを確認します。
次のような式になるように、='true'を「式」ボックスの式に追加します。
bpws:getVariableData('requiresApproval')='true'
「式」ボックスで、bpws:getVariableData関数全体をstring()関数でラップします。 「式」ボックスの値が次のように表示されていることを確認します。
string(bpws:getVariableData('requiresApproval')) = 'true'
「式ビルダー」ダイアログで、「OK」をクリックします。 「Switch Case」ダイアログに式が表示されます。
「Switch Case」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
<case>ブランチには、human taskアクティビティとswitchアクティビティの2つのアクティビティが含まれます。 このため、sequenceアクティビティをこの2つのアクティビティのコンテナにする必要があります。
コンポーネント・パレットから「Sequence」アイコンをドラッグして、<case>ボックスにドロップします。 <case>ボックスは次のように表示されます。
human taskアクティビティは、<case>ブランチに作成します。
コンポーネント・パレットで、ドロップダウン・リストから「Process Activities」を選択します。
コンポーネント・パレットから「Human Task」アイコンをドラッグして、<case>ボックスの「シーケンス」領域にドロップします。 「ヒューマン・タスクの追加」ダイアログが表示されます。
「ヒューマン・タスクの追加」ダイアログで、「タスク定義の作成」アイコン(「タスク定義」フィールドの2番目のアイコン)をクリックします。 別の「ヒューマン・タスクの追加」ダイアログが表示されます。
2番目の「ヒューマン・タスクの追加」ダイアログで、「ヒューマン・タスク名」に「ApproveOrder」と入力します。 これによって、場所がSOADEMO¥SOAOrderBooking¥bpel¥ApproveOrder¥ApproveOrder.taskに設定されます。
「OK」をクリックします。 JDeveloperで「ヒューマン・タスクの追加」ダイアログを閉じると、ApproveOrder.taskページが表示されます。
ApproveOrder.taskページでは、「タイトル」を空のままにします。
「パラメータ」で、次の操作を実行します。
緑の「+」アイコンをクリックし、「タスク・パラメータの追加」ダイアログを表示します。
「タスク・パラメータの追加」ダイアログで、「要素」を選択し、懐中電灯アイコンをクリックして「タイプの選択」ダイアログを表示します。 「タイプの選択」ダイアログで、「タイプ・エクスプローラ」→「プロジェクトのスキーマ・ファイル」→「OrderBookingPO.xsd」→「PurchaseOrder」の順に選択します。
「タイプの選択」ダイアログで、「OK」をクリックします。 「タスク・パラメータの追加」ダイアログは次のように表示されます。
「タスク・パラメータの追加」ダイアログで、「OK」をクリックします。
「割当ておよびルーティング・ポリシー」で、次の操作を実行します。
緑の「+」アイコンをクリックします。 「参加者タイプの追加」ダイアログが表示されます。
「タイプ」に対して、「単一の承認者」を選択します。
「ラベル」に対して、「Manager」と入力します。
「名前別」を選択し、「グループID」の懐中電灯アイコンをクリックします。これは、承認の権限をグループに付与するために実行します。 「アイデンティティ・ルックアップ・ダイアログ」が表示されます。
「アイデンティティ・ルックアップ・ダイアログ」で、「ルックアップ」をクリックします。 「グループの検索」ボックスにグループ名のリストが表示されます。
「グループの検索」ボックスで「Supervisor」を選択し、「選択」をクリックします。 グループ名が「選択したグループ」ボックスに移動します。
図8-156 選択した「Supervisor」が「選択したグループ」ボックスに移動した状態のアイデンティティ・ルックアップ・ダイアログ

「アイデンティティ・ルックアップ・ダイアログ」で、「OK」をクリックします。 「Supervisor」が「参加者タイプの追加」ダイアログに表示されます(図8-155)。
「参加者タイプの追加」ダイアログで、「OK」をクリックします。
ApproveOrder.taskページは次のように表示されます。
「ファイル」→「保存」の順に選択し、ApproveOrder.taskを保存します。
ApproveOrder.taskを閉じます(ファイル」→「閉じる」の順に選択します)。
SOAOrderBooking.bpelメイン・ページに戻り、「ApproveOrder_1」human taskアクティビティをダブルクリックします。 「Human Task」ダイアログが表示されます。
「タスクのタイトル」に、「Approve Order」と入力します。
「タスク・パラメータ」列には「PurchaseOrder」が表示されますが、「BPEL変数」列は空白です。 「BPEL変数」列の懐中電灯アイコンをクリックします。
「タスク・パラメータ」ダイアログで、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」の順に選択します。
「タスク・パラメータ」ダイアログで、「OK」をクリックします。
「Human Task」ダイアログは次のように表示されます。
「Human Task」ダイアログで、「OK」をクリックします。
JDeveloperでは、SOADEMO¥SOAOrderBooking¥bpel¥ApproveOrderディレクトリが作成され、このディレクトリ内に次のファイルが作成されます。
ApproveOrder.task
ApproveOrder_payload.xsd
WorkflowTask.xsd
マネージャは、承認待ちの注文を確認するときに、ワークリスト・アプリケーションにログインします。 このアプリケーションには、Oracle Application Serverが実行されているマシンの「スタート」メニューからアクセスできます。「スタート」→「プログラム」→「Oracle - ORACLE_HOME_NAME」→「Oracle BPEL Process Manager」→「Worklist Application」の順に選択します。
ワークリスト・アプリケーションで使用できるフォームを作成する必要があります。 このフォームを使用すると、ワークリスト・アプリケーションでは、SOA Order Bookingアプリケーション固有のデータを表示できます。
このフォームを作成する手順は、次のとおりです。
アプリケーション・ナビゲータで、「ApproveOrder」フォルダ(「SOAOrderBooking」→「インテグレーション・コンテンツ」の下にある)を右クリックし、「単純タスク・フォームの自動生成」を選択します。
JDeveloperのエディタに、payload-body.jspファイルが表示されます。 このファイルは変更せずに閉じることができます。
JDeveloperでは、次のディレクトリとファイルが作成されます。
SOADEMO¥SOAOrderBooking¥bpel¥ApproveOrder¥ApproveOrder_Display.tform
SOADEMO¥SOAOrderBooking¥public_html¥
「ApproveOrder_1」human taskアクティビティを開いて、このスコープに含まれるアクティビティを確認します(図8-147を参照)。 これらのアクティビティには、デフォルト設定をそのまま使用できます。
JDeveloperでは、human taskアクティビティの後にスイッチが自動的に作成されます。 このスイッチを使用すると、マネージャが注文を承認したか、却下したか、または注文が期限切れかどうかに応じて実行するアクションを定義できます。
このスイッチは、次のケースを処理します。
マネージャが注文を却下した場合
マネージャが注文を承認した場合
注文が期限切れの場合
マネージャが注文を却下した場合は、次の2つのアクティビティを実行します。
ステータス品目を、注文が却下されたことを示す文字列に設定します。
throwアクティビティを作成します。
switchアクティビティを開きます。
<case Task outcome is REJECT>について、デフォルトの「CopyPayloadFromTask」assignアクティビティを削除します。 これで、REJECTケースに対するアクティビティがなくなります。
コンポーネント・パレットで、ドロップダウン・リストから「Process Activities」を選択します。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、REJECTケースにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「コピー操作」タブをクリックします。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「式」に設定し、「式」ボックスに次の行を入力します。
string('Order has been rejected by the manager')
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「OrderBookingFault」→「payload」→「client:SOAOrderBookingProcessFault」→「client:status」の順に選択します。
「コピー操作の作成」ダイアログで、「OK」をクリックします。 「Assign」ダイアログに、コピー操作が表示されていることを確認します。
「Assign」ダイアログで、「OK」をクリックします。
フローの続行を停止するには、throwアクティビティを作成します。
コンポーネント・パレットから「Throw」アイコンをドラッグして、前のassignアクティビティの下にドロップします。
新規のthrowアクティビティをダブルクリックして、「Throw」ダイアログを表示します。
「Throw」ダイアログで、次の操作を実行します。
名前: 「Throw_1」と入力します(デフォルト名をそのまま使用)。
ネームスペースURI: 「http://www.globalcompany.com/ns/OrderBooking」と入力します。 これは手動で入力する必要があります。
ローカル・パート: 「OrderBookingFault」と入力します。 これは手動で入力する必要があります。
フォルト変数: 懐中電灯アイコンをクリックして「OrderBookingFault」を選択します。
「Throw」ダイアログで、「OK」をクリックします。
承認ケースで、デフォルトのassignアクティビティを削除し、「Empty」アイコンをコンポーネント・パレットからAPPROVEケースまでドラッグして、空のアクティビティを作成します。 ここでは処理が発生しないため、必要なのは空のアクティビティのみです。 フローは次のステップに進む必要があります。
期限切れ、失効、取消しまたはエラーの各ケースは、承認ケースと同じ方法で処理します。つまり、デフォルトのassignアクティビティを削除して空のアクティビティに置き換えます。 SOA Order Bookingアプリケーションでは注文に期限切れはなく、ユーザーがこのケースを処理することがないため、この方法を使用しても構いません。
このスコープはSelect ManufacturerとRapid Serviceの2つのサプライヤに注文情報を送信し、サプライヤはその注文に対する見積りを戻します。 次に、このスコープは、低い見積り金額を提示したサプライヤを選択します。
図8-163に、高レベルでの「SelectSupplier」スコープのアクティビティを示します。 このスコープでは、flowアクティビティを使用して、注文情報を2つのサプライヤにパラレルに送信します。 flowアクティビティには、各サプライヤに1つずつ、2つのスコープが含まれます。 サプライヤが見積りを戻すと、switchアクティビティによって低い金額の見積りが選択されます。
図8-163 高レベルで表示された「SelectSupplier」スコープに対するアクティビティ

図8-164に、flowアクティビティ内のアクティビティ、およびflowアクティビティの後のswitchアクティビティを示します。
Select Manufacturerに対するスコープにはreceiveアクティビティが含まれます。このアクティビティはRapid Serviceに対するスコープには必要ありません。 これは、Select Manufacturerは非同期に起動するためです。 receiveアクティビティは、Select Manufacturerが見積りを戻したときにその見積りを受信するために必要です。 Rapid Serviceは同期に起動します。invokeアクティビティは、リクエストを起動し、レスポンス(つまり、見積り値)を受信します。
switchアクティビティには2つのブランチがあります。<case>ブランチはSelectManufacturerが低い金額の見積りを戻したケースを、<otherwise>ブランチはRapid Serviceが低い金額の見積りを戻したケースを処理します。
図8-164 flowアクティビティとswitchアクティビティが表示された「SelectSupplier」スコープ

スコープを作成する前に、次の操作を実行する必要があります。
SelectManufacturerサービスおよびRapidServiceサービスを作成してデプロイします。詳細は、第7章「SelectManufacturerプロジェクトの作成」および第6章「RapidServiceプロジェクトの作成」を参照してください。
SelectManufacturerおよびRapidServiceへのパートナ・リンクを作成します。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Partner Link」アイコンをドラッグして、「サービス」スイムレーンにドロップします。
「パートナ・リンクの作成」ダイアログで、次の操作を実行します。
名前: 「SelectService」と入力します。
WSDLファイル: 「サービス・エクスプローラ」(懐中電灯)アイコン(左から2番目)をクリックします。 「サービス・エクスプローラ」ダイアログが表示されます。
「サービス・エクスプローラ」ダイアログで、「サービス・エクスプローラ」→BPELサービス→「soaDemoIntgServer」→「processes」→「default」→「SelectManufacturer」の順に選択します。
soaDemoIntgServerは、Select Manufacturerをデプロイした統合サーバーへの接続を参照します。
図8-165 「SelectService」パートナ・リンクに関する「サービス・エクスプローラ」ダイアログ

「サービス・エクスプローラ」ダイアログで、「OK」をクリックします。
パートナ・リンク・タイプ: 「SelectService_PL」を選択します(自動的に表示されます)。
パートナ・ロール: 「SelectServiceProvider」を選択します。
マイ・ロール: 「SelectServiceRequester」を選択します。
「パートナ・リンクの作成」ダイアログが次のように表示されていることを確認します。
図8-166 「SelectService」パートナ・リンクに関する「パートナ・リンクの作成」ダイアログ

「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
次のファイルを、soademo_101310_prod.zipファイルからSOAOrderBooking¥bpelディレクトリにコピーします。
RapidService.wsdl
WSDLファイルは、soademo_101310_prod.zipファイルのSOAOrderBooking¥bpelディレクトリにあります。
RapidService.wsdlファイルでURLを確認します。
「ファイル」→「開く」を順に選択してRapidService.wsdlファイルを開きます。
エディタの下部にある「ソース」タブをクリックし、ファイル内の行を表示します。
ファイル内のhttp://localhost:8888参照は、Oracle Application ServerがJDeveloperと同じマシン上で実行され、そのOracle Application Serverがポート8888でリクエストをリスニングしていることを前提としています。
必要に応じて、localhostをOracle Application Serverを実行しているマシンの名前に変更し、8888をOracle Application Serverインストールで使用する正しいポートに変更します(例: mypc.mydomain.com:8889)。
ファイルを編集した場合は、そのファイルを保存して閉じます。
コンポーネント・パレットから「Partner Link」アイコンをドラッグして、パートナ・リンク領域にドロップします。
「パートナ・リンクの作成」ダイアログで、次の操作を実行します。
名前: 「RapidService」と入力します。
WSDLファイル: 「サービス・エクスプローラ」アイコン(左から2番目)をクリックし、「サービス・エクスプローラ」ダイアログを表示します。 「サービス・エクスプローラ」ダイアログで「プロジェクトのWSDLファイル」を開き、「RapidService.wsdl」を選択します。
図8-167 「RapidService」パートナ・リンクに関する「サービス・エクスプローラ」ダイアログ

「サービス・エクスプローラ」で、「OK」をクリックします。
パートナ・リンク・タイプ: 「RapidQuote_PL」を選択します(自動的に表示されます)。
パートナ・ロール: 「RapidQuote_Role」を選択します。
マイ・ロール: 空白のままにします。
「パートナ・リンクの作成」ダイアログが次のように表示されていることを確認します。
「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
コンポーネント・パレットで、ドロップダウン・リストから「Process Activities」を選択します。
コンポーネント・パレットから「Scope」アイコンをドラッグして「requiresApproval」switchアクティビティの下にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「Scope」ダイアログの「一般」タブで、次の操作を実行します。
名前: 「SelectSupplier」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには2つの変数を作成する必要があります。
「変数」タブで「作成」をクリックし、最初の変数を作成します。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「selectManufacturerResponse」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「SelectService」→「SelectManufacturer」→「メッセージ・タイプ」→「RequestQuote_processRequestQuoteResponse」の順に選択します。
図8-169 selectManufacturerResponse変数に関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/selectservice}RequestQuote_processRequestQuoteResponse」に設定されます。
図8-170 selectManufacturerResponse変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。
「変数」タブで「作成」を再度クリックし、2番目の変数を作成します。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「rapidManufacturerResponse」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「RapidService」→「RapidService.wsdl」→「インポートしたWSDL」→「RequestQuoteSoapHttpPort」→「メッセージ・タイプ」→「RequestQuotePortType_POItemsQuoteResponse」の順に選択します。
図8-171 rapidManufacturerResponse変数に関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/rapidservice}RequestQuotePortType_POItemsQuoteResponse」に設定されます。
図8-172 rapidManufacturerResponse変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、変数が表示されます。
「Scope」ダイアログで、「OK」をクリックします。
flowアクティビティは、リクエストを複数のサプライヤに同時に送信するために使用します。 このアプリケーションでは、リクエストがSelect ManufacturerとRapid Serviceの2つのサプライヤに送信されます。
新規の「SelectSupplier」スコープを開きます。
コンポーネント・パレットから「Flow」アイコンをドラッグして、新規の「SelectSupplier」スコープにドロップします。
新規のflowインスタンスをダブルクリックし、「Flow」ダイアログで名前を「CallManufacturers」に設定します。
Select Manufacturerから見積りを取得するには、次のアクティビティを作成します。
「CallManufacturers」flowアクティビティを開きます。 このflowアクティビティには、アクティビティを定義できる2つのパラレル領域があります。
コンポーネント・パレットから「Scope」アイコンをドラッグして、flowアクティビティの左側にドロップします。 flowアクティビティの左側では、Select Manufacturerとの間のリクエストとレスポンスが処理されます。
新規のscopeインスタンスをダブルクリックします。 「Scope」ダイアログが表示されます。
「Scope」ダイアログの「一般」タブで、次の操作を実行します。
名前: 「GetSelectMfrQuote」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには1つの変数を作成する必要があります。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「manufacturerRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「SelectService」→「SelectManufacturer」→「メッセージ・タイプ」→「RequestQuote_processRequestQuote」の順に選択します。
「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/selectservice}RequestQuote_processRequestQuote」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、manufacturerRequest変数が表示されます。
「Scope」ダイアログで、「OK」をクリックします。
「GetSelectMfrQuote」スコープを開きます。
コンポーネント・パレットから「Transform」アイコンをドラッグして、「GetSelectMfrQuote」スコープにドロップします。
transformアクティビティをダブルクリックして、「Transform」ダイアログを表示します。
「一般」タブで、名前を「TransformSelectRequest」に設定します。
「トランスフォーメーション」タブで、「ソース変数」を「inputVariable」に、「ソース・パート」を「payload」に設定します。
「ターゲット変数」を「manufacturerRequest」に、「ターゲット・パート」を「parameters」に設定します。
「マッパー・ファイル」を「SelectTransformation.xsl」に設定します。 このファイルはまだ存在していないため、データ・マッパーを使用して生成します。
「マッピングの作成」アイコン(左から2番目)をクリックします。 データ・マッパーが表示され、これを使用してSelectTransformation.xslファイルを生成します。
データ・マッパーの「ソース」(左)側で、「po:PurchaseOrder」→「po:OrderItems」→「po:Item」の順に開きます。
「ターゲット」(右)側で、「tns:param0」を開きます。
「po:ProductName」を「tns:itemId」までドラッグします。
「po:Quantity」を「tns:quantity」までドラッグします。 データ・マッパーが次のように表示されていることを確認します。
データ・マッパーのコンポーネント・パレットで、ドロップダウンからXSLT Constructsを選択します。
コンポーネント・パレットから「for-each」アイコンをドラッグして、ターゲット側の「tns:param0」にドロップします。 for-each品目が「tns:processRequestQuoteElement」と「tns:param0」の間に表示されます。
「po:Item」を、ターゲット側の「for-each」品目までドラッグします。 データ・マッパーが表示されていることを確認します。
「ファイル」→「保存」の順に選択し、SelectTransformation.xslを保存します。 このファイルは、SOAOrderBooking¥bpelディレクトリ内に作成されます。
「ファイル」→「閉じる」の順に選択し、SelectTransformation.xsl用のデータ・マッパーを閉じます。
「ファイル」→「保存」の順に選択し、SOAOrderBooking.bpelを保存します。
このinvokeアクティビティは、「SelectManufacturer」パートナ・リンクを起動します。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「TransformSelectRequest」transformアクティビティの下にドロップします。
次のいずれかを実行して、「Invoke」ダイアログを表示します。
新規のinvokeアクティビティの横にある矢印のいずれかをドラッグして、「SelectService」パートナ・リンクにドロップします。 invokeアクティビティがパートナ・リンクに関連付けられます。
新規のinvokeアクティビティをダブルクリックします。
「Invoke」ダイアログで、invokeアクティビティの名前を「InvokeSelectManufacturer」に設定します。
「パートナ・リンク」フィールドが「SelectService」に設定されていない場合は、懐中電灯アイコンをクリックします。 「パートナ・リンクの選択」で、「SelectService」を選択し、「OK」をクリックします。
図8-180 「InvokeSelectManufacturer」invokeアクティビティに関する「パートナ・リンクの選択」ダイアログ

「操作」に対して、「processRequestQuote」を選択します。 この値は自動的に表示されます。
「入力変数」について、「変数の参照」アイコンをクリックして「変数の選択」ダイアログを表示します。 このダイアログで、「変数」→「プロセス」→「Scope - SelectSupplier」→「Scope - GetSelectMfrQuote」→「変数」→「manufacturerRequest」の順に選択します。
図8-181 「InvokeSelectManufacturer」invokeアクティビティの入力変数に関する「変数の選択」

「変数の選択」で、「OK」をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-182 「InvokeSelectManufacturer」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
このreceiveアクティビティは、Select Manufacturerから見積りを受信します。
コンポーネント・パレットから「Receive」アイコンをドラッグして、「InvokeSelectManufacturer」アクティビティの下にドロップします。
次のいずれかを実行して、「Receive」ダイアログを表示します。
新規のreceiveアクティビティの横にある矢印のいずれかをドラッグして、「SelectService」パートナ・リンクにドロップします。 receiveアクティビティがパートナ・リンクに関連付けられます。
新規のreceiveアクティビティをダブルクリックします。
「名前」に、「ReceiveSelectManufacturer」を設定します。
「パートナ・リンク」が「SelectService」に設定されていることを確認します。 設定されていない場合は、懐中電灯アイコンをクリックして、「パートナ・リンクの選択」を表示します。 「SelectService」を選択し、「OK」をクリックします。
図8-183 「ReceiveSelectManufacturer」receiveアクティビティに関する「パートナ・リンクの選択」ダイアログ

「操作」に、「processRequestQuoteResponse」を設定します。 この値は自動的に表示されます。
「Variable」について、「変数の参照」アイコンをクリックして「変数の選択」を表示します。 「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「selectManufacturerResponse」の順に選択します。
図8-184 「ReceiveSelectManufacturer」receiveアクティビティに関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
「インスタンスの作成」オプションは選択しません。
「Receive」ダイアログは図8-185のように表示されます。 「OK」をクリックします。
「ファイル」→「保存」の順に選択し、作業内容を保存します。
Rapid Manufacturerから見積りを取得するには、次のアクティビティを作成します。
Rapid Manufacturerに対するアクティビティは、flowアクティビティの右側を使用して定義します。
コンポーネント・パレットから「Scope」アイコンをドラッグして、flowアクティビティの右側にドロップします。 このスコープにアクティビティを定義して、Rapid Manufacturerとの間で発生するリクエストとレスポンスを処理します。
新規のscopeアクティビティをダブルクリックして、「Scope」ダイアログを表示します。
「一般」タブで、スコープの名前を「CallRapidManufacturer」に設定します。
「変数アクセスに関して直列化可能にする」は選択しません。
「変数」タブで「作成」をクリックし、「変数の作成」ダイアログを表示します。
「変数の作成」ダイアログで、変数名として「manufacturerRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「RapidService」→「RapidService.wsdl」→「インポートしたWSDL」→「RequestQuoteSoapHttpPort」→「メッセージ・タイプ」→「RequestQuotePortType_POItemsQuote」の順に選択します。
図8-186 「CallRapidManufacturer」スコープに関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/rapidservice}RequestQuotePortType_POItemsQuote」に設定されます。
図8-187 「CallRapidManufacturer」スコープに関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、manufacturerRequest変数が表示されます。
図8-188 「CallRapidManufacturer」スコープに関する「Scope」ダイアログ

「Scope」ダイアログで、「OK」をクリックします。
「CallRapidManufacturer」スコープを開きます。
コンポーネント・パレットから「Transform」アイコンをドラッグして、「CallRapidManufacturer」スコープにドロップします。
transformアクティビティをダブルクリックして、「Transform」ダイアログを表示します。
「一般」タブで、名前を「TransformRapidRequest」に設定します。
「トランスフォーメーション」タブで、「ソース変数」を「inputVariable」に、「ソース・パート」を「payload」に設定します。
「ターゲット変数」を「manufacturerRequest」に、「ターゲット・パート」を「parameters」に設定します。
「マッパー・ファイル」を「RapidTransformation.xsl」に設定します。 このファイルはまだ存在していないため、データ・マッパーを使用して生成します。
「マッピングの作成」アイコン(左から2番目)をクリックします。 データ・マッパーが表示され、これを使用してRapidTransformation.xslファイルを生成します。
データ・マッパーの「ソース」(左)側で、「po:PurchaseOrder」→「po:OrderItems」→「po:Item」の順に開きます。
「ターゲット」(右)側で、「tns:items」を開きます。
「po:ProductName」を「tns:itemId」までドラッグします。
「po:Quantity」を「tns:quantity」までドラッグします。 データ・マッパーが次のように表示されていることを確認します。
データ・マッパーのコンポーネント・パレットで、ドロップダウンからXSLT Constructsを選択します。
コンポーネント・パレットから「for-each」アイコンをドラッグして、ターゲット側の「tns:items」にドロップします。 for-each品目がtns:POItemsQuoteとtns:itemsの間に表示されます。
「po:Item」を、ターゲット側の「for-each」品目までドラッグします。 データ・マッパーが表示されていることを確認します。
「ファイル」→「保存」の順に選択して、RapidTransformation.xslを保存します。 このファイルは、SOAOrderBooking¥bpelディレクトリ内に作成されます。
「ファイル」→「閉じる」の順に選択し、RapidTransformation.xsl用のデータ・マッパーを閉じます。
「ファイル」→「保存」の順に選択し、SOAOrderBooking.bpelを保存します。
このinvokeアクティビティは、「RapidService」パートナ・リンクを起動します。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「TransformRapidRequest」transformアクティビティの下にドロップします。
次のいずれかを実行して、「Invoke」ダイアログを表示します。
新規のinvokeアクティビティの横にある矢印のいずれかをドラッグして、「RapidService」パートナ・リンクにドロップします。 invokeアクティビティがパートナ・リンクに関連付けられます。
新規のinvokeアクティビティをダブルクリックします。
「Invoke」ダイアログで、invokeアクティビティの名前を「InvokeRapidManufacturer」に設定します。
「パートナ・リンク」フィールドが「RapidService」に設定されていることを確認します。 設定されていない場合は、懐中電灯アイコンをクリックして「パートナ・リンクの選択」を表示し、「RapidService」を選択して「OK」をクリックします。
図8-191 「InvokeRapidManufacturer」アクティビティに関する「パートナ・リンクの選択」ダイアログ

「操作」で、「POItemsQuote」を選択します。 この値は自動的に表示されます。
「入力変数」で、「変数の参照」アイコンをクリックして「変数の選択」ダイアログを表示します。 このダイアログで、「変数」→「プロセス」→「Scope - SelectSupplier」→「Scope - CallRapidManufacturer」→「変数」→「manufacturerRequest」の順に選択します。
図8-192 「InvokeRapidManufacturer」アクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
「出力変数」で、「変数の参照」アイコンをクリックして「変数の選択」ダイアログを表示します。 このダイアログで、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「rapidManufacturerResponse」の順に選択します。
図8-193 「InvokeRapidManufacturer」アクティビティの出力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-194 「InvokeRapidManufacturer」アクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
低い金額の見積りを提示したサプライヤを選択できるスイッチを作成します。
「SelectSupplier」スコープのflowアクティビティを最小化します (ただし、スコープは最小化しないでください)。 ページが次のように表示されていることを確認します。
コンポーネント・パレットから「Switch」アイコンをドラッグして、「CallManufacturers」flowアクティビティの下(ただし、「SelectSupplier」スコープ内)にドロップします。
switchアクティビティをダブルクリックして、「Switch」ダイアログを表示します。
「Switch」ダイアログで、名前を「SelectByPrice」に設定し、「OK」をクリックします。
このswitchアクティビティについては、<case>ブランチに対する条件を指定する必要があります。 <otherwise>ブランチの場合、条件の設定は必要はありません。 <case>ブランチで条件が満たされない場合は、<otherwise>ブランチのアクティビティが実行されます。
switchアクティビティを開きます。
<case>ボックスのタイトル・バーをダブルクリックして、「Switch Case」ダイアログを表示します。
<case>ブランチは、Select ManufacturerがRapid Serviceより低い金額を戻したケースを処理します。 「式」領域に次の行を入力します。
number(bpws:getVariableData('selectManufacturerResponse','parameters',
'/ns15:processRequestQuoteResponseElement/ns15:return/ns15:supplierPrice')) <
number(bpws:getVariableData('rapidManufacturerResponse','parameters',
'/ns16:POItemsQuoteResponse/ns30:return/ns30:supplierPrice'))
ネームスペースの接頭辞は、次のように置き換える必要があります。
ns15は、http://www.globalcompany.com/ns/selectserviceの接頭辞です。
ns16は、http://www.globalcompany.com/ns/rapidserviceの接頭辞です。
式ビルダーを使用して条件を作成することもできます。
「Switch Case」ダイアログで、「式」ボックスの上にある「XPath式ビルダー」アイコンをクリックします。
「式ビルダー」ダイアログで、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「selectManufacturerResponse」→「parameters」→「ns15:processRequestQuoteResponseElement」→「ns15:return」→「ns15:supplierPrice」の順に選択します。
ダイアログの「コンテンツのプレビュー」ボックスに、supplierPriceデータを取得するためのbpws:getVariableData関数がパラメータとともに表示されます。
「式に挿入」をクリックします。
「式ビルダー」ダイアログが次のように表示されていることを確認します。
「式ビルダー」ダイアログの「式」ボックスに、<(より小さい)文字を入力します。 図8-197に、「式ビルダー」ダイアログの「式」ボックスを示します。
「式ビルダー」ダイアログで、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「rapidManufacturerResponse」→「parameters」→「ns16:POItemsQuoteResponse」→「ns16:return」→「ns16:supplierPrice」の順に選択します。
「式に挿入」をクリックします。
「式ビルダー」ダイアログが次のように表示されていることを確認します。
次のような式になるように、各bpws:getVariableData関数をnumber関数でラップします。
number(bpws:getVariableData(....)) < number(bpws:getVariableData(....))
bpws:getVariableData関数の前にnumber(を、関数の後に閉じカッコの)を手動で入力する必要があります。
完成した式が次のように表示されていることを確認します。
「式ビルダー」ダイアログで、「OK」をクリックします。
「Switch Case」ダイアログで、「OK」をクリックします。
低い金額の見積りが提示された場合のSelect Manufacturerに対するアクティビティを定義します。 この場合は、見積り値をinputVariableのsupplierPriceフィールドに割り当てます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、<case>ボックスにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignSelectManufacturer」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 2つのコピー操作を作成します。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「selectManufacturerResponse」→「parameters」→「ns15:processRequestQuoteResponseElement」→「ns15:return」→「ns15:supplierPrice」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:SupplierInfo」→「ns1:SupplierPrice」の順に選択します。
図8-201 「AssignSelectManufacturer」アクティビティに関する「コピー操作の作成」ダイアログ、1番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「作成」ドロップダウンから「コピー操作」を再度選択して、2番目のコピー操作を作成します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「selectManufacturerResponse」→「parameters」→「ns15:processRequestQuoteResponseElement」→「ns15:return」→「ns15:supplierName」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:SupplierInfo」→「ns1:SupplierName」の順に選択します。
図8-202 「AssignSelectManufacturer」アクティビティに関する「コピー操作の作成」ダイアログ、2番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに2つのコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-203 「AssignSelectManufacturer」アクティビティに関する「Assign」ダイアログ

低い金額の見積りが提示された場合のRapid Manufacturerに対するアクティビティを定義します。 この場合は、見積り値をinputVariableのsupplierPriceフィールドに割り当てます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、<otherwise>ボックスにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignRapidManufacturer」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 2つのコピー操作を作成します。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「rapidManufacturerResponse」→「parameters」→「ns16:POItemsQuoteResponse」→「ns16:return」→「ns16:supplierPrice」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:SupplierInfo」→「ns1:SupplierPrice」の順に選択します。
図8-204 「AssignRapidManufacturer」アクティビティに関する「コピー操作の作成」ダイアログ、1番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「作成」ドロップダウンから「コピー操作」を再度選択して、2番目のコピー操作を作成します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SelectSupplier」→「変数」→「rapidManufacturerResponse」→「parameters」→「ns16:POItemsQuoteResponse」→「ns16:return」→「ns16:supplierName」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:SupplierInfo」→「ns1:SupplierName」の順に選択します。
図8-205 「AssignRapidManufacturer」アクティビティに関する「コピー操作の作成」ダイアログ、2番目のコピー操作

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに2つのコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-206 「AssignRapidManufacturer」アクティビティに関する「Assign」ダイアログ

「ファイル」→「保存」の順に選択して、作業内容を保存します。
このスコープは、注文の出荷方法を判断するFulfillmentESBプロジェクトを起動します。 $500以上の注文では、Fedexが出荷方法になります。 $500未満の注文では、USPSが出荷方法になります。 このルールは、第4章「FulfillmentESBプロジェクトの作成」で説明したFulfillmentESBプロジェクトで定義されています。
「PostFulfillmentReq」スコープを作成には、FulfillmentESBプロジェクトをOracle Application Serverに登録する必要があります。
図8-207に、「PostFulfillmentReq」スコープのアクティビティを示します。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Partner Link」アイコンをドラッグして、「サービス」スイムレーンにドロップします。 「パートナ・リンクの作成」ダイアログが表示されます。
「名前」に「OrderFulfillment」と入力します。
「WSDLファイル」で、「サービス・エクスプローラ」アイコン(左から2番目)をクリックし、「サービス・エクスプローラ」ダイアログを表示します。 「サービス・エクスプローラ」ダイアログで、「サービス・エクスプローラ」→「Registered ESB Services」→「soademoIntegServer」→「Fulfillment」→「OrderFulfillment」の順に選択します。soademoIntegServerは統合サーバー接続の名前を参照します。
図8-208 「OrderFulfillment」パートナ・リンクに関する「サービス・エクスプローラ」

「サービス・エクスプローラ」で、「OK」をクリックします。
java.net.UnknownHostExceptionエラーが発生した場合は、「パートナ・リンクの作成」ダイアログに戻ります。
プロキシ設定が正しく設定されていることを確認します。 JDeveloperのプロキシ設定を表示するには、「ツール」→「設定」の順に選択します。 「設定」ダイアログで、左側にある「Webブラウザとプロキシ」を選択します。
プロキシ設定が正しい場合は、URLのIPアドレスをホスト名に置き換えます。 次に例を示します。
http://pc1.mydomain.com:8888/esb/wsil/Fulfillment/OrderFulfillment?wsdl
ホスト名を入力した後に[Tab]キーを押します。
「パートナ・リンク・タイプ」で、「execute_pptLT」を選択します。 これは自動的に表示されます。
「パートナ・ロール」で、「execute_pptProvider」を選択します。
「マイ・ロール」は空白のままにします。
「パートナ・リンクの作成」ダイアログが次のように表示されていることを確認します。
図8-209 「OrderFulfillment」パートナ・リンクに関する「パートナ・リンクの作成」ダイアログ

「パートナ・リンクの作成」ダイアログで、「OK」をクリックします。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Scope」アイコンをドラッグして、「SelectSupplier」スコープの下にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「一般」タブで、次の操作を実行します。
名前: 「PostFulfillmentReq」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには1つの変数を作成する必要があります。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「orderFulfillmentRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。
「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「OrderFulfillment」→「インポートしたWSDL」→「Fulfillment_OrderFulfillment.wsdl」→「メッセージ・タイプ」→「PurchaseOrder_request」の順に選択します。
図8-210 「PostFulfillmentReq」スコープに関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://www.globalcompany.com/ns/Fulfillment}PurchaseOrder_request」に設定されます。
図8-211 「PostFulfillmentReq」スコープに関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、orderFulfillmentRequest変数が表示されます。
図8-212 「PostFulfillmentReq」スコープに関する「Scope」ダイアログ

「Scope」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
「PostFulfillmentReq」スコープを開きます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「PostFulfillmentReq」スコープにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「initializeRequest」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 1つのコピー操作を作成します。
「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」の順に選択します。
図8-213 「initializeRequest」アクティビティに関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、コピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-214 「initializeRequest」アクティビティに関する「Assign」ダイアログ

コンポーネント・パレットから「Invoke」アイコンをドラッグして、「initializeRequest」assignアクティビティの下にドロップします。
次のいずれかを実行して、「Invoke」ダイアログを表示します。
新規のinvokeアクティビティの横にある矢印のいずれかをドラッグして、「OrderFulfillment」パートナ・リンクにドロップします。 invokeアクティビティがパートナ・リンクに関連付けられます。
新規のinvokeアクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「PostFulfillmentReq」と入力します。
パートナ・リンク: 「OrderFulfillment」に設定されていることを確認します。 設定されていない場合は、懐中電灯アイコンをクリックし、「パートナ・リンクの選択」から「OrderFulfillment」を選択します。
図8-215 「PostFulfillmentReq」invokeアクティビティに関する「パートナ・リンクの選択」ダイアログ

「パートナ・リンクの選択」で、「OK」 をクリックします。
操作: 「execute」を選択します(自動的に表示されます)。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - PostFulfillmentReq」→「変数」→「orderFulfillmentRequest」の順に選択します。
図8-216 「PostFulfillmentReq」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-217 「PostFulfillmentReq」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
すべての例外を捕捉するには、CatchAllブランチを作成します。
「PostFulfillmentReq」スコープの横にある「CatchAllブランチの追加」アイコンをクリックします。
図8-218 「PostFulfillmentReq」スコープの横にあるCatchAllアイコン

この図では、CatchAllブランチがスコープの外側に表示されています。
図8-219 「PostFulfillmentReq」スコープの外側に表示されたCatchAllブランチ

CatchAllブランチを開きます。
コンポーネント・パレットから「Empty」アイコンをドラッグして、CatchAllブランチにドロップします。 このCatchは例外を捕捉するのみで処理は実行しません。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このスコープでは、データベース・アダプタを使用して、データベース内の注文ステータスを更新します。
図8-220に、スコープのアクティビティを示します。
コンポーネント・パレットで、ドロップダウンから「Services」を選択します。
コンポーネント・パレットから「Database Adapter」アイコンをドラッグして、「サービス」スイムレーンにドロップします。 アダプタ構成ウィザードが起動します。 「次へ」をクリックして開始します。
ステップ1のサービス名ページで、「サービス名」を「OrderStatus」に設定します。 説明は空白のままにします。
「次へ」をクリックします。
ステップ2のサービス接続ページで、「接続」に対してデータベース接続の名前を選択します。 JNDI名が「eis/DB/soademo」に自動的に設定されていることを確認します。
「次へ」をクリックします。
ステップ3の操作タイプ・ページで、「表に対して操作を実行」を選択し、「更新のみ」を選択します。
「次へ」をクリックします。
「表の選択」で、「表のインポート」をクリックします。 「表のインポート」ダイアログが表示されます。
「表のインポート」ダイアログで、次の操作を実行します。
スキーマ: 「SOADEMO」を選択します。
名前フィルタ: 「%」と入力します。
「問合せ」をクリックします。
左側にあるORDERS表を選択し、右矢印をクリックして「選択済」ボックスに移動します。
「表のインポート」ダイアログで、「OK」をクリックします。
表の選択ページに戻って、「SOADEMO.ORDERS」を選択します。
「終了」をクリックして、残りの画面にデフォルト値を受け入れます。
ウィザードにより次のファイルが作成されます。
SOAOrderBooking¥bpel¥OrderStatus.wsdl
SOAOrderBooking¥bpel¥OrderStatus_table.xsd
SOAOrderBooking¥bpel¥OrderStatus_toplink_mappings.xml
SOAOrderBooking¥src¥OrderStatus¥Orders.java
SOAOrderBooking¥toplink¥OrderStatus¥OrderStatus.mwp
Oracle JDeveloperにパートナ・リンクのダイアログが表示されます。次のフィールドが入力済になっています。
名前: OrderStatus
WSDLファイル: SOAOrderBooking/bpel/OrderStatus.wsdl
パートナ・リンク・タイプ: OrderStatus_plt
パートナ・ロール: OrderStatus_role
図8-226 「OrderStatus」データベース・アダプタに関する「パートナ・リンクの作成」ダイアログ

「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
コンポーネント・パレットで、ドロップダウンから「Process Activities」を選択します。
コンポーネント・パレットから「Scope」アイコンをドラッグして、「PostFulfillmentReq」スコープの下にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「一般」タブで、
名前: 「SetFinalOrderStatus」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには1つの変数を作成する必要があります。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「orderStatusRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。
「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「OrderStatus」→「OrderStatus.wsdl」→「メッセージ・タイプ」→「OrdersCollection_msg」の順に選択します。
図8-227 「SetFinalOrderStatus」スコープ内の「orderStatusRequest」変数に関する「タイプの選択」ダイアログ

「タイプの選択」で、「OK」をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://xmlns.oracle.com/pcbpel/adapter/db/OrderStatus/}OrdersCollection_msg」に設定されます。
図8-228 「SetFinalOrderStatus」スコープ内の「orderStatusRequest」変数に関する「変数の作成」ダイアログ

「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、orderStatusRequest変数が表示されます。
図8-229 「SetFinalOrderStatus」スコープに関する「Scope」ダイアログ

「Scope」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
「SetFinalOrderStatus」スコープを開きます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「SetFinalOrderStatus」スコープにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignOrderStatus」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 2つのコピー操作を作成します。
1番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:ID」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SetFinalOrderStatus」→「変数」→「orderStatusRequest」→「OrdersCollection」→「ns19:OrdersCollection」→「ns19:Orders」→「ns19:ordid」の順に選択します。
図8-230 「AssignOrderStatus」アクティビティの1番目のコピー操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
2番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を再度選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「式」に設定し、「式」ボックスに次の行を入力します。
string('completed')
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SetFinalOrderStatus」→「変数」→「orderStatusRequest」→「OrdersCollection」→「ns19:OrdersCollection」→「ns19:Orders」→「ns19:status」の順に選択します。
図8-231 「AssignOrderStatus」アクティビティの2番目のコピー操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、複数のコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-232 「AssignOrderStatus」アクティビティに関する「Assign」ダイアログ

データベース内のORDERS表にある注文ステータスを更新するには、「UpdateOrderStatus」invokeアクティビティを作成します。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「AssignOrderStatus」assignアクティビティの下にドロップします。
次にいずれかを実行して、「Invoke」ダイアログを表示します。
新規のinvokeアクティビティの横にある矢印のいずれかをドラッグして、「OrderStatus」データベース・アダプタにドロップします。 invokeアクティビティがデータベース・アダプタに関連付けられます。
新規のinvokeアクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「UpdateOrderStatus」と入力します。
パートナ・リンク: 「OrderStatus」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「OrderStatus」を選択します。
図8-233 「UpdateOrderStatus」invokeアクティビティに関する「パートナ・リンクの選択」ダイアログ

「パートナ・リンクの選択」で、「OK」 をクリックします。
操作: 「更新」を選択します。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - SetFinalOrderStatus」→「変数」→「orderStatusRequest」の順に選択します。
図8-234 「UpdateOrderStatus」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-235 「UpdateOrderStatus」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
このスコープでは、通知サービスを使用して、注文の履行時に、顧客に電子メールを送信します。
図8-236に、「NotifyCustomer」スコープのアクティビティを示します。
コンポーネント・パレットから「Email」アイコンをドラッグして、「SetFinalOrderStatus」スコープの下にドロップします。 電子メールの編集ダイアログが表示されます。
電子メールの編集ダイアログの各フィールドに、任意の情報を入力します。 図8-237に例を示します。
ほとんどのフィールドで、「XPath式ビルダー」アイコンをクリックして式ビルダーを表示できます。 これによって、フィールドのデータをカスタマイズできます。
例1: 顧客の電子メール・アドレスを「To」フィールドに入力する場合
「To」フィールドで、「XPath式ビルダー」アイコン(右にあるアイコン)をクリックします。
「式ビルダー」ダイアログで、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns4:PurchaseOrder」→「ns4:UserContact」→「ns4:EmailAddress」の順に選択します。
「式に挿入」をクリックします。 ダイアログが次のように表示されていることを確認します。
「OK」をクリックします。
例2: 電子メールの「本文」に、顧客名、注文IDおよび注文ステータスを含める場合。 次に、入力するテキストの例を示します。
Dear firstName This is to inform you that your order number, orderID, has been orderStatus If you have a question about your order, please contact customer service or send an email to customerservice@globalcompany.com Thank you for doing business with Global Company. We appreciate your business! Global Company Customer Service
firstName、orderIDおよびorderStatusは、動的に取得されるデータに対するプレースホルダです。
「本文」の「XPath式ビルダー」アイコンをクリックします。
concat関数を使用して、本文テキストの各部を連結します。
最初に、次の行を「式」ボックスに入力します。
concat(string('Dear '), )
最後のカッコの前に挿入ポイントを置きます。
名に対する変数の追加: 「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns4:PurchaseOrder」→「ns4:ShipTo」→「ns4:Name」→「ns4:First」の順に選択します。
「式に挿入」をクリックします。 式は次のように表示されます。
concat(string('Dear '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ShipTo/
ns4:Name/ns4:First'))
メッセージの次の部分(注文IDまで)の追加: 最後の閉じカッコの前に挿入ポイントを置いて、メッセージの次の部分(太字で表示)を入力します。
concat(string('Dear '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ShipTo/
ns4:Name/ns4:First'), string('This is to inform you that your order number '), )
「式」ボックスでは改行を挿入できませんが、電子メールの編集ダイアログでは挿入できます。
最後のカッコの前に挿入ポイントを置きます。
注文IDに対する変数の追加: 「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns4:PurchaseOrder」→「ns4:ID」の順に選択します。
「式に挿入」をクリックします。 式は次のように表示されます。
concat(string('Dear '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ShipTo/
ns4:Name/ns4:First'), string('This is to inform you that your order
number '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ID'))
メッセージに、文字列「has been」を追加します。 新しい部分は太字で表示されます。
concat(string('Dear '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ShipTo/
ns4:Name/ns4:First'), string('This is to inform you that your order
number '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ID')
, string('has been '), )
最後のカッコの前に挿入ポイントを置きます。
注文ステータスに対する変数の追加: 「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns4:PurchaseOrder」→「ns4:OrderInfo」→「ns4:OrderStatus」の順に選択します。
「式に挿入」をクリックします。 式は次のように表示されます。
concat(string('Dear '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ShipTo/
ns4:Name/ns4:First'), string('This is to inform you that your order
number '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ID')
, string('has been '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:OrderInfo/
ns4:OrderStatus'))
メッセージの最終部分を追加します。この部分は太字で表示されます。
concat(string('Dear '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ShipTo/
ns4:Name/ns4:First'), string('This is to inform you that your order
number '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:ID')
, string('has been '), bpws:getVariableData('inputVariable','payload',
'/client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:OrderInfo/
ns4:OrderStatus'), string('If you have a question about your order, please
contact customer service or send an email to
customerservice@globalcompany.com
Thank you for doing business with Global Company. We appreciate your
business!
Global Company Customer Service'))
「式ビルダー」で、「OK」をクリックします。 電子メールの編集ダイアログは次のように表示されます。 複数の改行が本文に追加され、読みやすくなりました。
電子メールの編集ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
「Email_1」アクティビティを開くと、2つのアクティビティ(assignアクティビティとinvokeアクティビティ)が含まれていることを確認できます。 これらのアクティビティを編集する必要はありません。
assignアクティビティの「EmailParamsAssign」には、電子メールの編集ダイアログで指定した情報が含まれています。
invokeアクティビティの「InvokeNotificationService」は、通知サービスをコールして、電子メールを送信します。
このinvokeアクティビティは、クライアントにステータスを戻します。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、「NotifyCustomer」(これは「Email_1」スコープです)スコープの下にドロップします。
次にいずれかを実行して、「Invoke」ダイアログを表示します。
新規のinvokeアクティビティの横にある矢印のいずれかをドラッグして、「client」パートナ・リンクにドロップします。 invokeアクティビティがパートナ・リンクに関連付けられます。
新規のinvokeアクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「callbackClient」と入力します。
パートナ・リンク: 「client」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「client」を選択します。
図8-241 「callbackClient」invokeアクティビティに関する「パートナ・リンクの選択」ダイアログ

「パートナ・リンクの選択」で、「OK」 をクリックします。
操作: 「onResult」を選択します(自動的に表示されます)。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「outputVariable」を選択します。
図8-242 「callbackClient」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-243 「callbackClient」invokeアクティビティに関する「Invoke」ダイアログ

「ファイル」→「保存」の順に選択して、作業内容を保存します。
センサーを「callbackClient」invokeアクティビティに追加すると、完了した注文の情報をデータベース、ファイル、JMSなどの異なる宛先タイプに書き込むことができます。
このプロジェクトの最初の部分にある第8.6項「clientからの入力の受信(receiveアクティビティ)」で説明した「receiveInput」receiveアクティビティに対しても、センサーを作成したことを思い出してください。
「callbackClient」invokeアクティビティをダブルクリックします。 「Invoke」ダイアログが表示されます。
「Invoke」ダイアログで、「センサー」をクリックします。
「作成」をクリックして、新規のセンサーを作成します。 「アクティビティ・センサーの作成」ダイアログが表示されます。
「アクティビティ・センサーの作成」ダイアログで、「名前」を「InstanceCompleted」に設定します。
「評価時間」を「完了」に設定します。 センサーの起動時間が指定されます。 「完了」は、このアクティビティの実行後にセンサーが起動されることを示します。
「アクティビティ変数センサー」セクションで、「作成」をクリックし、「アクティビティ変数センサーの作成」ダイアログを表示します。
「アクティビティ変数センサーの作成」ダイアログで、「変数XPath」の鉛筆アイコンをクリックします。 「変数XPathビルダー」ダイアログが表示されます。
「変数」→「プロセス」→「変数」→「inputVariable」の順に選択します。
「変数XPathビルダー」ダイアログで、「OK」をクリックします。 「アクティビティ変数センサーの作成」ダイアログには、次の値が表示されます(図8-244を参照)。
変数XPath: $inputVariable
出力ネームスペース: http://www.globalcompany.com/ns/OrderBooking
出力データ型: SOAOrderBookingRequestMessage
「アクティビティ変数センサーの作成」ダイアログで、「OK」をクリックします。 「アクティビティ・センサーの作成」ダイアログに戻ります。このダイアログは次のように表示されます。
「アクティビティ・センサーの作成」ダイアログの「センサー・アクション」セクションで、「追加」アイコンをクリックします。 「センサー・アクションの選択」ダイアログが表示されます。 このダイアログには、InstanceStartという既存のセンサーが表示されます。これは、第8.6.2項「receiveアクティビティ用のセンサーの作成」で作成したセンサーです。
「センサー・アクションの選択」ダイアログで、「センサー・アクション」を選択し、棒型アイコンから「センサー・アクション」を選択します。 「センサー・アクションの作成」ダイアログが表示されます。
「センサー・アクションの作成」ダイアログで、次の操作を実行します。
名前: 「InstanceCompleted」と入力します。
パブリッシュ・タイプ: 「JMSトピック」を選択します。
JMSコネクション・ファクトリ: 「jms/TopicConnectionFactory」と入力します。
パブリッシュ・ターゲット: 「jms/demoTopic」と入力します。
フィルタ: 空白のままにします。
有効化: このオプションを選択します。
「センサー・アクションの作成」ダイアログで、「OK」をクリックします。 「センサー・アクションの選択」ダイアログに、「InstanceCompleted」センサー・アクションが表示されます。
「センサー・アクションの選択」で、「OK」 をクリックします。 「アクティビティ・センサーの作成」ダイアログに戻ります。このダイアログは次のように表示されます。
「アクティビティ・センサーの作成」ダイアログで、「OK」をクリックします。
「Invoke」ダイアログの「センサー」タブは、次のように表示されます。
「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
プロジェクト全体にCatchブランチを追加すると、そのプロジェクト内でエラーが発生した場合に、データベース内の注文ステータスを更新できます。
図8-252に、Catch内のアクティビティを示します。
図8-252 「client:OrderBookingFault」Catch内のアクティビティ

「SOAOrderBooking」スコープで、三角形に感嘆符が重なったアイコンをクリックして、Catchブランチをプロジェクトに追加します。 このレベルでの追加によって、このCatchは、プロジェクト内のすべてのアクティビティで使用できます。
図8-253 「SOAOrderBooking」スコープの「Catchブランチの追加」アイコン

右にスクロールし、新規のCatchブランチを確認して開きます。 新規のブランチには、アクティビティがありません。
「Catch」アイコンをダブルクリックして、「Catch」ダイアログを表示します。
「Catch」ダイアログで、次の操作を実行します。
ネームスペースURI: 「http://www.globalcompany.com/ns/OrderBooking」と入力します。
ローカル・パート: 「OrderBookingFault」と入力します。
フォルト変数: 「OrderBookingFault」と入力します。
「Catch」ダイアログで、「OK」をクリックします。
スコープは、Catch領域に作成します。これは、アクティビティに対する変数はこのCatch領域に定義する必要があるためです。
コンポーネント・パレットから「Scope」アイコンをドラッグして、Catch領域にドロップします。
新規のスコープをダブルクリックして、「Scope」ダイアログを表示します。
「Scope」ダイアログの「一般」タブで、次の操作を実行します。
名前: 「SetOrderStatus」と入力します。
変数アクセスに関して直列化可能にする: 選択しません。
「変数」タブをクリックします。 このスコープには1つの変数を作成する必要があります。
「変数」タブで、「作成」をクリックします。
「変数の作成」ダイアログで、次の操作を実行します。
名前: 「orderStatusRequest」と入力します。
「メッセージ・タイプ」を選択し、懐中電灯アイコンをクリックして「タイプの選択」を表示します。 「タイプの選択」で、「タイプ・エクスプローラ」→「メッセージ・タイプ」→「パートナ・リンク」→「OrderStatus」→「OrderStatus.wsdl」→「メッセージ・タイプ」→「OrdersColllection_msg」の順に選択します。
「タイプの選択」で、「OK」 をクリックします。
「変数の作成」ダイアログで、「メッセージ・タイプ」が「{http://xmlns.oracle.com/pcbpel/adapter/db/OrderStatus/}OrdersCollection_msg」に設定されます。
「変数の作成」ダイアログで、「OK」をクリックします。
「Scope」ダイアログの「変数」タブに、orderStatusRequest変数が表示されます。
「Scope」ダイアログで、「OK」をクリックします。
「SetOrderStatus」スコープを開きます。
コンポーネント・パレットから「Assign」アクティビティ・アイコンをドラッグして、「SetOrderStatus」スコープにドロップします。
新規のassignアクティビティをダブルクリックして、「Assign」ダイアログを表示します。
「Assign」ダイアログで、「一般」タブをクリックし、「名前」を「AssignOrderStatus」に設定します。
さらに「Assign」ダイアログで、「コピー操作」タブをクリックします。 3つのコピー操作を作成します。
1番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「inputVariable」→「payload」→「client:SOAOrderBookingProcessRequest」→「ns1:PurchaseOrder」→「ns1:ID」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SetOrderStatus」→「変数」→「orderStatusRequest」→「OrdersCollection」→「ns19:OrdersCollection」→「ns19:Orders」→「ns19:ordid」の順に選択します。
図8-259 「AssignOrderStatus」assignアクティビティの1番目のコピー操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
2番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を再度選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「式」に設定し、「式」ボックスに次の行を入力します。
string('canceled')
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SetOrderStatus」→「変数」→「orderStatusRequest」→「OrdersCollection」→「ns19:OrdersCollection」→「ns19:Orders」→「ns19:status」の順に選択します。
図8-260 「AssignOrderStatus」assignアクティビティの2番目のコピー操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
3番目のコピー操作の作成: 「作成」ドロップダウンから「コピー操作」を再度選択します。 「コピー操作の作成」ダイアログが表示されます。
「From」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「変数」→「OrderBookingFault」→「payload」→「client:SOAOrderBookingProcessFault」→「client:status」の順に選択します。
「To」側で、「タイプ」を「Variable」に設定し、「変数」→「プロセス」→「Scope - SetOrderStatus」→「変数」→「orderStatusRequest」→「OrdersCollection」→「ns19:OrdersCollection」→「ns19:Orders」→「ns19:comments」の順に選択します。
図8-261 「AssignOrderStatus」assignアクティビティの3番目のコピー操作に関する「コピー操作の作成」ダイアログ

「コピー操作の作成」ダイアログで、「OK」をクリックします。
「Assign」ダイアログに、3つのコピー操作が表示されていることを確認します。 「OK」をクリックします。
図8-262 「AssignOrderStatus」アクティビティに関する「Assign」ダイアログ

「ファイル」→「保存」の順に選択して、作業内容を保存します。
コンポーネント・パレットから「Invoke」アイコンをドラッグして、Catch領域にある「AssignOrderStatus」assignアクティビティの下にドロップします。
次にいずれかを実行して、「Invoke」ダイアログを表示します。
新規のinvokeアクティビティの横にある矢印のいずれかをドラッグして、「OrderStatus」データベース・アダプタにドロップします。 invokeアクティビティがデータベース・アダプタに関連付けられます。
新規のinvokeアクティビティをダブルクリックします。
「Invoke」ダイアログで、次の値を設定します。
名前: 「SetFaultedOrderStatus」と入力します。
パートナ・リンク: 「OrderStatus」に設定されていることを確認します。 設定されていない場合は、懐中電灯をクリックし、「パートナ・リンクの選択」から「OrderStatus」を選択します。
図8-263 「SetFaultedOrderStatus」invokeアクティビティに関する「パートナ・リンクの選択」ダイアログ

「パートナ・リンクの選択」で、「OK」 をクリックします。
操作: 「更新」を選択します。
入力変数: 「変数の参照」アイコン(左から2番目)をクリックし、「変数」→「プロセス」→「Scope - SetOrderStatus」→「変数」→「orderStatusRequest」の順に選択します。
図8-264 「SetFaultedOrderStatus」invokeアクティビティの入力変数に関する「変数の選択」ダイアログ

「変数の選択」で、「OK」 をクリックします。
「Invoke」ダイアログが次のように表示されていることを確認します。
図8-265 「SetFaultedOrderStatus」invokeアクティビティに関する「Invoke」ダイアログ

「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
なんらかの理由で完了しなかった注文の情報をデータベース、ファイル、JMSなどの異なる宛先に書き込むには、「SetFaultedOrderStatus」invokeアクティビティにセンサーを作成します。 ここでは、JMSトピックを書き込みます。
「SetFaultedOrderStatus」invokeアクティビティをダブルクリックして、「Invoke」ダイアログを起動します。
「Invoke」ダイアログで、「センサー」をクリックします。
「作成」をクリックして、新規のセンサーを作成します。 「アクティビティ・センサーの作成」ダイアログが表示されます。
「アクティビティ・センサーの作成」ダイアログで、「名前」を「InstanceFaulted」に設定します。
「評価時間」を「完了」に設定します。 センサーの起動時間が指定されます。 「完了」は、このアクティビティの実行後にセンサーが起動されることを示します。
「アクティビティ変数センサー」セクションで、「作成」をクリックし、「アクティビティ変数センサーの作成」ダイアログを表示します。
「アクティビティ変数センサーの作成」ダイアログで、「変数XPath」の鉛筆アイコンをクリックします。 「変数XPathビルダー」ダイアログが表示されます。
「変数」→「プロセス」→「変数」→「OrderBookingFault」の順に選択します。
「変数XPathビルダー」で、「OK」をクリックします。 「アクティビティ変数センサーの作成」ダイアログには、次の値が表示されます(図8-266を参照)。
変数XPath: $OrderBookingFault
出力ネームスペース: http://www.globalcompany.com/ns/OrderBooking
出力データ型: SOAOrderBookingFaultMessage
「アクティビティ変数センサーの作成」ダイアログで、「OK」をクリックします。 「アクティビティ・センサーの作成」ダイアログに戻ります。このダイアログは次のように表示されます。
「アクティビティ・センサーの作成」ダイアログの「センサー・アクション」セクションで、「追加」アイコンをクリックします。 「センサー・アクションの選択」ダイアログが表示されます。 このダイアログには、InstanceStartおよびInstanceCompletedという既存のセンサーが表示されます。これらは、それぞれ第8.6.2項「receiveアクティビティ用のセンサーの作成」および第8.18.2項「センサーの追加」で作成したセンサーです。
「センサー・アクションの選択」ダイアログで、「センサー・アクション」を選択し、棒型アイコンから「センサー・アクション」を選択します。 「センサー・アクションの作成」ダイアログが表示されます。
「センサー・アクションの作成」ダイアログで、次の操作を実行します。
名前: 「InstanceFaulted」と入力します。
パブリッシュ・タイプ: 「JMSトピック」を選択します。
JMSコネクション・ファクトリ: 「jms/TopicConnectionFactory」と入力します。
パブリッシュ・ターゲット: 「jms/demoTopic」と入力します。
フィルタ: 空白のままにします。
有効化: このオプションを選択します。
「センサー・アクションの作成」ダイアログで、「OK」をクリックします。 「センサー・アクションの選択」ダイアログに、「InstanceFaulted」センサー・アクションが表示されます。
「センサー・アクションの選択」で、「OK」 をクリックします。 「アクティビティ・センサーの作成」ダイアログに戻ります。このダイアログは次のように表示されます。
「アクティビティ・センサーの作成」ダイアログで、「OK」をクリックします。
「Invoke」ダイアログの「センサー」タブは、次のように表示されます。
「Invoke」ダイアログで、「OK」をクリックします。
「ファイル」→「保存」の順に選択して、作業内容を保存します。
アプリケーション・ナビゲータで、「SOAOrderBooking」→「リソース」の下にある「build.properties」をダブルクリックします。 このファイルには、BPELプロジェクトをデプロイするときに、build.xmlで使用する値が定義されています。
build.propertiesファイルにある次の行を(#文字を削除して)非コメント化します。
platform=ias_10g domain=default rev=1.0 admin.user=oc4jadmin admin.password=welcome99 http.hostname=myAppServerMachine.mydomain.com http.port=8888 j2ee.hostname=myAppServerMachine.mydomain.com rmi.port=23793 opmn.requestport=6005 oc4jinstancename=home
必要に応じて編集します。 太字イタリック体の値は一般的な値であり、変更が必要です。
rmi.portの値を確認するには、次のコマンドを実行します。
ORACLE_HOME¥opmn¥bin¥opmnctl status -l
ORACLE_HOMEには、Oracle Application ServerのOracleホームを指定します。
opmn.requestportの値を確認するには、手順6を参照してください。
「ファイル」→「保存」の順に選択して、変更内容をbuild.propertiesに保存します。
「build.xml」を右クリックし、「Antを実行」を選択します。
「Antを実行」ダイアログで、「プロパティ」タブをクリックします。
「プロパティ・ファイル」セクションで、「追加」をクリックします。 「Antプロパティ・ファイルの追加」ダイアログで、SOAOrderBookingディレクトリの「build.properties」ファイルを選択し、「開く」をクリックします。
「Antを実行」ダイアログが次のように表示されていることを確認します。
図8-274 「プロパティ」タブに、ロードされたbuild.propertiesファイルが表示された「Antを実行」ダイアログ

「OK」をクリックします。 JDeveloperによってAntが実行され、プロジェクトがコンパイルおよびデプロイされます。 エラーが発生した場合は、次の項第8.20.1項「Antを使用したDeveloper Promptからのデプロイ」を参照してください。
エラーが発生した場合は、build.propertiesファイルに入力した値が正しいことを確認します。
値は正しいが、エラーが発生する場合は、Developer Promptからantを実行してプロジェクトをデプロイできます。
「スタート」→「プログラム」→「Oracle - instanceName」→「Oracle BPEL Process Manager」→「Developer Prompt」の順に選択します。 Oracle BPEL Process Manager用に構成されたシェル・ウィンドウが表示されます。
SOAOrderBookingプロジェクトをデプロイするには、Developer Promptのシェル・ウィンドウからantを実行する必要があることに注意してください。 プロジェクトをデプロイするために、通常のオペレーティング・システム・シェルからantを実行することは、サポートされていません。
Developer Promptウィンドウで、ディレクトリをSOADEMO¥SOAOrderBookingディレクトリに変更します。SOADEMOは、SOA Order Bookingアプリケーションを作成したディレクトリを表します。
> cd SOADEMO
> cd SOAOrderBooking
JDeveloperとOracle Application Serverを異なるマシンで実行している場合は、JDeveloperマシンからOracle Application ServerマシンにSOAOrderBookingディレクトリをコピーできます。 このディレクトリは、Oracle Application Serverマシンの任意の場所に配置できます。 Developer Promptでは、このディレクトリに簡単に移動できます。
antを実行します。
> ant
デプロイした後のSOAOrderBookingは、Oracle BPEL Controlに表示されます。 Oracle BPEL Controlは、ブラウザに次のURLを入力して表示します。
http://hostname:port/BPELConsole
oc4jadminユーザーでログインします。
Oracle BPEL Controlの「ダッシュボード」タブに、SOAOrderBookingが表示されます。
図8-275 SOAOrderBookingが表示されたOracle BPEL Control

SOAOrderBookingに対するWSDLは、ブラウザで次のURLを入力すると参照できます。
http://hostname:port/orabpel/default/SOAOrderBooking/1.0/SOAOrderBooking?wsdl