ワークフローの中には、1 人のユーザーだけで実行されるものがあります。例えば、
オンライン・ブックストアでの本の注文などです。このタイプのワークフローには、並列パスは存在しません。
completeAndClaimSuccessor API は、このタイプのワークフローの処理をサポートします。
このタスクを実行する理由と実行時期
オンライン・ブックストアでは、購入者は一連の操作を完了することで
本を注文します。この一連の操作は、スタッフ・アクティビティー (参加タスク) として
インプリメントできます。購入者が複数の書籍を注文する場合は、
これが次のスタッフ・アクティビティーの要求に相当します。このタイプのワークフローは、
ページ・フローとも呼ばれます。ユーザー・インターフェース定義が、
ユーザー・インターフェースのダイアログのフローを制御するアクティビティーと
関連付けられているためです。
completeAndClaimSuccessor API は
スタッフ・アクティビティーを完了し、ログオン・ユーザーの同じプロセス・インスタンスで次のアクティビティーを
要求します。そして、次に要求したアクティビティーの情報 (処理される入力メッセージなど) を
戻します。次のアクティビティーは、
完了したアクティビティーと同じトランザクション内で使用可能になるため、トランザクション境界がプロセス・モデルで participates に設定される必要があります。
このタスクのステップ
- アクティビティー・シーケンスで最初のアクティビティーを要求します。
//
//Query the list of activities that can be claimed by the logged-on user
//
QueryResultSet result =
process.query("ACTIVITY.AIID",
"PROCESS_INSTANCE.NAME = 'CustomerOrder' AND
ACTIVITY.STATE = ACTIVITY.STATE.STATE_READY AND
ACTIVITY.KIND = ACTIVITY.KIND.KIND_STAFF AND
WORK_ITEM.REASON =
WORK_ITEM.REASON.REASON_POTENTIAL_OWNER",
(String)null, (Integer)null, (TimeZone)null);
...
//
//Claim the first activity
//
if (result.size() > 0)
{
result.first();
AIID aiid = (AIID) result.getOID(1);
ClientObjectWrapper input = process.claim(aiid);
DataObject activityInput = null ;
if ( input.getObject()!= null && input.getObject() instanceof DataObject )
{
activityInput = (DataObject)input.getObject();
// read the values
...
}
}
アクティビティーが要求される
と、アクティビティーの入力メッセージが戻されます。
- アクティビティーの作業が終了したら、そのアクティビティーを完了して
次のアクティビティーを要求します。
アクティビティーを完了するには、出力メッセージを
渡します。出力メッセージを作成
する場合、メッセージ・タイプ名を指定して、メッセージ
定義が含まれるようにする必要があります。
ActivityInstanceData activity = process.getActivityInstance(aiid);
ClientObjectWrapper output =
process.createMessage(aiid, activity.getOutputMessageTypeName());
DataObject myMessage = null ;
if ( output.getObject()!= null && output.getObject() instanceof DataObject )
{
myMessage = (DataObject)output.getObject();
//set the parts in your message, for example, an order number
myMessage.setInt("OrderNo", 4711);
}
//complete the activity and claim the next one
CompleteAndClaimSuccessorResult successor =
process.completeAndClaimSuccessor(aiid, output);
このアクションにより、アイテム番号を含む出力メッセージが設定され、
シーケンス内の次のアクティビティーが要求されます。後続アクティビティーに AutoClaim が
設定されている場合は、ランダムなアクティビティーが次のアクティビティーとして戻されます。
このユーザーに割り当てられる後続アクティビティーがもうない場合は、Null が戻されます。後続アクティビティーに AutoClaim が設定されていて、その後に続くパスが複数ある場合は、後続アクティビティーのすべてが要求され、ランダムなアクティビティーが次のアクティビティーとして戻されます。
後に続くことができる並列パスがプロセスに含まれ、これらのパスに、ログオン・ユーザーが潜在的な所有者であるスタッフ・アクティビティーが複数含まれる場合、ランダムなアクティビティーが自動的に要求され、次のアクティビティーとして戻されます。
- 次のアクティビティーを処理します。
String name = successor.getActivityName();
ClientObjectWrapper nextInput = successor.getInputMessage();
if ( nextInput.getObject()!=
null && nextInput.getObject() instanceof DataObject )
{
activityInput = (DataObject)input.getObject();
// read the values
...
}
- アクティビティーを完了する場合は、
ステップ 2 に進みます。