ビジネス・ルールとは企業のポリシーを記述する文です。Oracle BPEL Process ManagerをOracle Business Rulesなどのビジネス・ルール・エンジンと組み合せて使用している場合は、BPELプロセス自体を変更、停止または再デプロイせずに、企業のポリシーに関連する変更をBPELプロセスで実施できます。さらに、ビジネス・アナリストや企業のポリシーを理解している担当者は、BPEL開発者の介入なしにビジネス・ルールを変更できます。
Oracle Business Rulesを使用してビジネス・ルールを定義した後は、次のコンポーネントを追加して、BPELプロセスにルールを実装します。
デシジョン・サービス・パートナ・リンク: デシジョン・サービスは、他のパートナ・リンクと同様にWSDLファイルを作成しますが、デシジョン・サービス・ウィザードも起動します。デシジョン・サービス・ウィザードのガイドに従って、ルールセットまたは関数および起動パターンを選択します。選択した内容は、BPELプロセスと通信するWebサービスに変換されます。
decideアクティビティ: このアクティビティは、デシジョン・サービス・ウィザードで作成したデシジョン・サービス・パートナ・リンクを起動します。また、decideアクティビティを使用して、ルールセットまたは関数のファクト・データとBPEL変数間のコピー操作の割当てを作成します。
図7-18に、ビジネス・ルールをOracle BPEL Process Managerの前述のコンポーネントと統合するプロセスを示します。
図7-18 ビジネス・ルールとOracle BPEL Process Managerコンポーネントの統合
SOA Order Bookingアプリケーションでは、BPELプロセスに、企業のポリシーを実装するルールを取り扱うdecideアクティビティが含まれています。顧客のステータスが「platinum」でない場合は、$1000以上のすべての注文に対して、手動による与信承認が必要です。
ビジネス・ルールの使用に関する詳細は、次の章およびマニュアルを参照してください。
デシジョン・サービス・ウィザードを使用して、Oracle Business RulesのRules Engineで作成したルールセットまたは関数を選択します。また、実行する起動パターンを次のオプションから選択します。
ファクトのアサートのみ: 将来アサート(事実に基づいたデータをルール・エンジンに送信)するルール・エンジン・ファクトを選択します。BPELのassignアクティビティを使用してファクトに必要なデータを割り当てます。基礎となるルール・セッションはステートフルであることが必要です。ステートフルでないと、ルール・エンジンをその後起動しても、アサートしたファクトは表示されません。
結果の取得: ビジネス・ルール・エンジンから結果を取得します。結果の値は、それらのファクトに対する過去のルールセットの実行によって、変更されている可能性があります。ウィザードでは、結果を取得できるキャッシュ内にステートフル・ルール・セッションがあることを前提にしています。このような状況は、BPELプロセスで「ファクトのアサート、ルールセットの実行」起動パターンが以前に実行された場合に発生します。
ファクトのアサート、ルールセットの実行: ファクトがアサートされた後にルールセットが実行されることを除けば、「ファクトのアサートのみ」と同じです。ウィザードでは、ステートフル・ルール・セッションが作成(または使用)されます。そうでない場合は、このパターンの実行結果が消失します。このオプションでは、ビジネス・ルール・エンジンから結果は取得されません。
ファクトのアサート、ルール・セットの実行、結果の取出し: 結果がビジネス・ルール・エンジンから取得されることを除けば、「ファクトのアサート、ルールセットの実行」と同じです。assignアクティビティを使用して、ルールセットの実行結果をBPEL変数にマップします。ルール・セッションはアクティブなままです。これによって、以前にアサートされたファクトを再利用できます。
ファクトのアサート、ルールセットの実行、結果の取出し、セッションのリセット: 次回のWebサービスの起動で結果がリセットされることを除けば、「ファクトのアサート、ルール・セットの実行、結果の取出し」と同じです。セッションをリセットすると、以前にアサートされたファクト値は消去されます。
ファンクションの実行: 関数の実行を選択します。関数はディクショナリにも定義されています。ルールセットの場合は、入出力ファクトを選択します。関数の場合は、一定の入力パラメータと単一の戻り値を取り扱います。
関数の実行およびセッションのリセット: このパターンに対してステートフル・ルール・セッションが作成されることを除けば、「ファンクションの実行」と同じです。すべてのファクト値は、関数の戻り値を取得した後にリセットされます。
デシジョン・サービス・ウィザードを使用してデシジョン・サービス・パートナ・リンクを作成する手順は、次のとおりです。
「Decision Service」を「サービス」スイムレーンのいずれかにドラッグ・アンド・ドロップします。
図7-19に示すように、デシジョン・サービス・ウィザードを使用して、起動パターンとルールセットまたは関数を指定します。
サービス名を入力します。
これは、パートナ・リンクの名前になります。
ネームスペースを入力するか、デフォルト値をそのまま使用します。
起動パターンを選択します。
「ルールセット」または「関数」フィールドの横にある懐中電灯アイコンをクリックします(表示されるフィールドは、選択した起動パターンによって異なります)。
「新規ルール・エンジン接続の作成」アイコン(左側のアイコン)をクリックします。
ルール・エクスプローラを使用して、ビジネス・ルール・エンジンへの接続を作成し、ルールセットまたは関数を選択します。
ルールセットまたは関数を選択すると、コントロールがエクスプローラ・ウィンドウに戻り、ルールセットまたは関数のリポジトリへの接続がナビゲーション・ツリーに表示されます。
「新規ルール・エンジン接続の作成」ダイアログを使用して、ビジネス・ルール・エンジンでルールセットおよび関数が格納されるリポジトリのタイプを選択します。
このリリースでは、Oracle Rules Engineのリポジトリがサポートされます。
ファイル・リポジトリのディレクトリを入力し(または「フォルダ」アイコンを使用して参照し)、「次へ」をクリックします。
コントロールが「ルール・エクスプローラ」ウィンドウに戻り、ルールセットまたは関数のリポジトリへの接続がナビゲーション・ツリーに表示されます。
ディクショナリおよびディクショナリ・バージョンのノードを開き、ルールセットを選択して「OK」をクリックします。
デシジョン・サービス・ウィザードの「結果または関数の選択」ダイアログを使用して、入力ファクトおよびオプションの出力(監視)ファクトを指定し、「次へ」をクリックします。
ファクトのアサートによって、ルールセットまたは関数に対してファクトをアサート(事実に基づいたデータをビジネス・ルール・エンジンに送信)できます。ファクトの監視によって、ルールセットまたは関数から結果を戻すことができます。ファクトの監視は、結果を取得する起動パターンを選択した場合にのみ表示されます。
次のいずれかを選択します。
最上位レベル要素のすべての子をアサートするには、ここをクリックしてください。: 選択したルールセットまたは関数のすべての子をアサートできます。たとえば、発注ルールセットに3つの品目が含まれているとします。このチェック・ボックスが選択されていると、発注および3つの品目すべてがアサートされます。このチェック・ボックスの選択が解除されていると、発注のみがアサートされます。
起動パターンを追加するには、ここをクリックしてください。: 相互作用パターンを同じパートナ・リンクに追加できます。追加できるのはルールセットの起動パターンのみです。関数の起動パターンは追加できません。
デシジョン・サービス・ウィザードの「XSDファイルのコピー」ダイアログを使用して、画面上のメッセージを点検し、このプロジェクトに必要なすべてのXSDスキーマ・ファイルがウィザードによってリポジトリからインポートされたことを確認します。
ウィザードでは、このプロジェクトにインポートする必要があるリポジトリ内のスキーマ・ファイルすべての識別が試みられます。この試行に基づいて、ウィンドウには次のステータス・メッセージが表示されます。
デシジョン・サービス・ウィザードで、インポートするスキーマ・ファイルが検出された場合は、このウィンドウの上部にファイルのディレクトリ・パスが表示されます。この場合は、特に何もする必要はありません。
デシジョン・サービス・ウィザードで、インポートするスキーマ・ファイルが検出されない場合は、このウィンドウの上部にファイルのディレクトリ・パスが表示されます。これらのファイルを指定のディレクトリに手動でコピーする必要があります。
このXSDスキーマ・ファイルに他のスキーマ・ファイルが含まれている(インポートされている)場合は、これらのファイルが、画面上に指示されているBPELプロジェクトのbpel¥rules¥xsd
サブ・ディレクトリにコピーされていることを確認してください。これらのスキーマ・ファイルには、相対ディレクトリ・パスのみを使用してください。
「次へ」をクリックします。
デシジョン・サービス・パートナ・リンクが作成されます。
decideアクティビティを使用すると、デシジョン・サービス・ウィザードで作成したデシジョン・サービス・パートナ・リンクを起動するBPELプロセスのアクティビティを作成できます。このアクティビティを使用して、ルールセットまたは関数のファクト・データとBPEL変数間のコピー操作の割当てを作成することもできます。
完成すると、assignアクティビティとinvokeアクティビティで構成される、デシジョン・サービス・パートナ・リンクに対するdecideアクティビティが作成されます。
decideアクティビティを作成する手順は、次のとおりです。
「Decide」アクティビティをBPELプロセスにドラッグ・アンド・ドロップします。
名前を入力し、作成したデシジョン・サービス・パートナ・リンクおよび起動パターン(実行する操作)を選択します。
「入力ファクトの割当て」をクリックし、「作成」をクリックして入力ファクトのマッピングを作成します。
これによって、入力(アサート)ファクト・タイプに対応する自動作成されたBPEL変数に、BPEL入力変数をマップする割当てを作成できます。
結果を取得する起動パターンを選択した場合は、「出力ファクトの割当て」をクリックし、次に「作成」をクリックして出力ファクトのマッピングを作成します。
これによって、出力(監視)ファクト・タイプに対応する自動作成されたBPEL変数をマップする割当てを作成できます。
完了する場合は、「OK」をクリックします。
assignアクティビティとinvokeアクティビティで構成される、デシジョン・サービス・パートナ・リンクに対するdecideアクティビティが作成されます。
Webサービスに対する新しいデシジョン・サービス・パートナ・リンクが作成され、Oracle Business RulesのRules Engineとインタフェースします。ルールセットに基づいてWSDLファイルが生成されます。
デシジョン・サービス・ウィザードによって、次の機能が提供されます。
動的処理(インテリジェント・ルーティング、プロセス内のポリシーの検証および制約チェック)
不定参加者タイプのワークフローとの統合(ポリシー・ベースのタスク割当て、様々なエスカレーション・ポリシーおよびタスクのロード・バランシング)
Business Activity Monitoringとの統合(特定のポリシーに基づくアラートの送信、および動的処理ベースの推論)
例7-8に、SOA Order Bookingアプリケーションの「RequiresManualApproval」decideアクティビティのソース・コードを示します。
例7-8 「RequiresManualApproval」decideアクティビティのソース・コード
<scope name="RequiresManualApproval"> <bpelx:annotation> <bpelx:pattern patternName="bpelx:decide"></bpelx:pattern> </bpelx:annotation> <variables> <variable name="com_oracle_demos_orderbooking_Approve" element="ns27:approve"/> <variable name="dsIn" messageType="ns28:assertExecuteWatchStatefulMessage"/> <variable name="dsOut" messageType="ns28:assertExecuteWatchStatefulDecisionMessage"/> </variables> <faultHandlers> <catchAll> <switch name="Switch_2"> <case condition="bpws:getVariableData('inputVariable','payload','/ client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:OrderInfo/ ns4:OrderPrice') >= 1000"> <assign name="Assign_4"> <copy> <from expression="true()"/> <to variable="requiresApproval"/> </copy> </assign> </case> <otherwise> <assign name="Assign_4"> <copy> <from expression="false()"/> <to variable="requiresApproval"/> </copy> </assign> </otherwise> </switch> </catchAll> </faultHandlers> <sequence name="Sequence_16"> <assign name="BPEL_Header"> <copy> <from expression="'DecisionService'"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/@name"/> </copy> <copy> <from expression="concat(ora:getProcessURL(), '/decisionservices.decs')"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:configURL"/> </copy> <copy> <from expression="ora:getProcessId()"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:bpelInstance/ns13:processId"/> </copy> <copy> <from expression="ora:getProcessVersion()"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:bpelInstance/ns13:processVersion"/> </copy> <copy> <from expression="ora:getDomainId()"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:bpelInstance/ns13:domainId"/> </copy> <copy> <from expression="ora:getProcessURL()"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:bpelInstance/ns13:processURL"/> </copy> <copy> <from expression="ora:getInstanceId()"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:bpelInstance/ns13:instanceId"/> </copy> <copy> <from expression="ora:getConversationId()"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:bpelInstance/ns13:conversationId"/> </copy> </assign> <assign name="BPEL_Var_To_Rule_Facts"> <copy> <from expression="number(bpws:getVariableData('inputVariable','payload','/ client:SOAOrderBookingProcessRequest/ns4:PurchaseOrder/ns4:OrderInfo/ ns4:OrderPrice'))"/> <to variable="com_oracle_demos_orderbooking_Approve" query="/ns27:approve/ns27:price"/> </copy> <copy> <from expression="string(bpws:getVariableData('customerServiceResponse', 'parameters','/ns3:findCustomerByIdResponse/ns3:return/ns3:status'))"/> <to variable="com_oracle_demos_orderbooking_Approve" query="/ns27:approve/ns27:status"/> </copy> </assign> <assign name="Facts_To_Rule_Service"> <copy> <from variable="com_oracle_demos_orderbooking_Approve"/> <to variable="dsIn" part="payload" query="/ns28:assertExecuteWatchStateful/ns28:assertList/ns27:approve"/> </copy> </assign> <invoke name="Invoke" partnerLink="DecisionServicePL" portType="ns28:IDecisionService" operation="assertExecuteWatchStateful" inputVariable="dsIn" outputVariable="dsOut"/> <assign name="Rule_Service_To_Facts"> <copy> <from variable="dsOut" part="payload" query="/ns28:assertExecuteWatchStatefulDecision/ns28:resultList/ns27:approve"/> <to variable="com_oracle_demos_orderbooking_Approve"/> </copy> </assign> <assign name="Facts_To_BPEL_Var"> <copy> <from variable="dsOut" part="payload" query="/ns28:assertExecuteWatchStatefulDecision/ns28:resultList/ ns27:approve/ns27:approvalRequired"/> <to variable="requiresApproval"/> </copy> </assign> </sequence> </scope>