カスタム内容ルーティング・ロジックの使用

判断では、指定した基準に対してメッセージの内容が検証および評価されます。評価結果によって、メッセージのルーティング方法が決まります。評価基準は、「遷移」プロパティ・ダイアログの「条件のコード」プロパティに、Javaコード形式で入力します。または、「編集」ボタンをクリックして、コード・エディタを使用することもできます。次の要件を満たすコードを作成します。

アクティビティ図から作成すると、ルーティング・コードに対するクラス・ファイルがRoutingLogicdiagram_name.javaという名前で作成されます。ジェネレータは、各アクティビティ図に対してルーティング・ファイルを1つ作成します。このファイルには、内容ベースのルーティングを必要とするダイアグラム内の各判断に対するルーティング・コードが格納されます。デフォルトでは、このクラスは生成されたアクティビティ図と同じパッケージに配置されます。

入力したコードは、最初にE-Business統合コード・ジェネレータを実行する際にJavaファイルに生成されます。再びジェネレータを実行しても、最初に生成されたメソッドは変更されません。これは、生成後にメソッドに対して変更を行った場合に備えた処置です。

注意: 

ファイルには、ルーティングを必要とする各判断に対するmakeDecisionidentifier(Document[] messages)メソッドが含まれます。このメソッドには、各メッセージのタイプがorg.w3c.dom.Documentであるmessage要素の配列が渡されます。このメソッドは、その判断をソースに持つ各遷移に対応するプライベート・メソッドをコールし、その結果、ワークフローが判断を通過するルートを決定するためのコードを返します。

makeDecisionメソッドには、ソースが判断ではOR擬似状態である各遷移に対して、プライベートなisDecisionidentifierRuleXTrue(Document[] messages)メソッドがあります。メソッドの本体は、その遷移に対する「条件のコード」プロパティに入力したJavaコードです。

E-Business統合コード・ジェネレータは、各ブロックのJavaコードをboolean型の戻り値を持つメソッドとして生成します。

判断で使用可能なすべてのメッセージ(通常は1つのみですが、判断と同期点が結合されているケースでは複数の場合があります)の内容には、タイプがorg.w3c.dom.Documentのオブジェクトを含むmessages配列を介してアクセスできます。

Javaコードの定義を完了すると、ジェネレータではすべてのメソッドがRoutingLogicdiagram_name.javaクラス内に配置され、専用のワークフロー機能アクティビティによってOracle Workflowからコールできるメソッドが追加されます。

たとえば、注文数に基づいてメッセージのルーティングを決定する判断があるとします。注文数が1000よりも少ない場合、在庫が割り当てられます。注文数が1000を超える場合、信用検査が実行されます。このような判断のダイアグラムは次のようになります。

図1: 内容ベースのルーティングを必要とする判断

This illustration is described in the text.

ORとCheck Creditアクティビティを結ぶ遷移に対して入力する、注文数が1000を超えるかどうかをテストする条件コードは、次のようになります。


for (int i=0; i < messages.length;i++)
{
Element docEl = messages[i].getDocumentElement();
NodeList valueNodes = docEl.getElementsByTagName("VALUE");
if (valueNodes.getLength() > 0)
{
Node valueNode = valueNodes.item(0);
Text valueText = (Text) valueNode.getFirstChild();
int valueFromNode = Integer.parseInt(valueText.getData());
return valueFromNode > 1000;
}
}
return false;

ORとAllocate Stockアクティビティを結ぶ遷移に対して入力する、注文数が1000以下かどうかをテストする条件コードは、次のようになります。


for (int i=0;i < messages.length;i++)
{
Element docEl = messages[i].getDocumentElement();
NodeList valueNodes = docEl.getElementsByTagName("VALUE");
if (valueNodes.getLength() > 0)
{
Node valueNode = valueNodes.item(0);
Text valueText = (Text) valueNode.getFirstChild();
int valueFromNode = Integer.parseInt(valueText.getData());
return valueFromNode <= 1000;
}
} return false;

関連項目

遷移について

遷移の作成