1 ユーザーのワークフローの処理

ワークフローの中には、1 人のユーザーだけで実行されるものがあります。例えば、 オンライン・ブックストアでの本の注文などです。このタイプのワークフローには、並列パスは存在しません。 completeAndClaimSuccessor API は、このタイプのワークフローの処理をサポートします。

このタスクを実行する理由と実行時期

オンライン・ブックストアでは、購入者は一連の操作を完了することで 本を注文します。この一連の操作は、スタッフ・アクティビティー (参加タスク) として インプリメントできます。購入者が複数の書籍を注文する場合は、 これが次のスタッフ・アクティビティーの要求に相当します。このタイプのワークフローは、 ページ・フローとも呼ばれます。ユーザー・インターフェース定義が、 ユーザー・インターフェースのダイアログのフローを制御するアクティビティーと 関連付けられているためです。

completeAndClaimSuccessor API は スタッフ・アクティビティーを完了し、ログオン・ユーザーの同じプロセス・インスタンスで次のアクティビティーを 要求します。そして、次に要求したアクティビティーの情報 (処理される入力メッセージなど) を 戻します。次のアクティビティーは、 完了したアクティビティーと同じトランザクション内で使用可能になるため、トランザクション境界がプロセス・モデルで participates に設定される必要があります。

このタスクのステップ

  1. アクティビティー・シーケンスで最初のアクティビティーを要求します。
    //
    //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
        ...
      }  
    }
    アクティビティーが要求される と、アクティビティーの入力メッセージが戻されます。
  2. アクティビティーの作業が終了したら、そのアクティビティーを完了して 次のアクティビティーを要求します。

    アクティビティーを完了するには、出力メッセージを 渡します。出力メッセージを作成 する場合、メッセージ・タイプ名を指定して、メッセージ 定義が含まれるようにする必要があります。

    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 が設定されていて、その後に続くパスが複数ある場合は、後続アクティビティーのすべてが要求され、ランダムなアクティビティーが次のアクティビティーとして戻されます。

    後に続くことができる並列パスがプロセスに含まれ、これらのパスに、ログオン・ユーザーが潜在的な所有者であるスタッフ・アクティビティーが複数含まれる場合、ランダムなアクティビティーが自動的に要求され、次のアクティビティーとして戻されます。

  3. 次のアクティビティーを処理します。
    String name = successor.getActivityName();
    
    ClientObjectWrapper nextInput = successor.getInputMessage();
    if ( nextInput.getObject()!=
                   null && nextInput.getObject() instanceof DataObject )
    {
      activityInput = (DataObject)input.getObject();
      // read the values
      ...
    }  
  4. アクティビティーを完了する場合は、 ステップ 2 に進みます。

(c) Copyright IBM Corporation 2005, 2006. All rights reserved.
(c) Copyright IBM Japan 2006
このインフォメーション・センターでは、Eclipse テクノロジー (http://www.eclipse.org) が採用されています。