jBPM 4.4:Execution Serviceサービス


最新の流れの例--ByKey
以下は、フロー定義のための新しいフロー例を起動する最も簡単であり、最も一般的な方法である.
ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL");
上のserviceの方法は、キーがICLの最新バージョンのフロー定義を検索して、最新のフロー定義でフロー例を起動します.
keyがICLの流れで新バージョンを展開すると、startProcess Instance ByKeyメソッドが自動的に最新の展開に切り替わります.
元々起動されていたプロセスは、起動時刻のバージョンで実行されますか?
 
指定フローバージョン--ById
言い換えれば、特定のバージョンに従ってフローを起動したいなら、フロー定義のid起動フローの例を使用することができる.以下の通りです
ProcessInstance processInstance =
    executionService.startProcessInstanceById("ICL-1");
 
キーを使う
このkeyはプロcessのkeyではなく、起動するinstanceのkeyである.このkeyはユーザが実行する時に定義され、「業務key」として参照されることがある.一つの業務keyは、フロー定義されたすべてのバージョンの範囲内で唯一でなければならない.通常、業務の流れの分野でこのようなkeyを見つけやすいです.例えば、注文IDとか保険番号とか.
ProcessInstance processInstance =
    executionService.startProcessInstanceByKey("ICL", "CL92837"); 
// 2   :
//       processkey,    key  process     
//               key(instance key)
keyは、プロセスのインスタンスのidを作成するために使用されてもよく、フォーマットは{process-key}、{execution-id}である.したがって、上のコードはICL.C 92837のフローを作成します.
ユーザー定義のキーが提供されていない場合、データベースはキーをキーとします.このようにして、以下のようにIDを得ることができる.
ProcessInstance processInstance =
    executionService.startProcessInstanceByKey("ICL");
String pid = processInstance.getId();
 
ユーザー定義のkeyが一番いいです.特にあなたのアプリケーションコードの中で、このようなキーを見つけるのは難しくないです.ユーザー定義のkeyを提供します.流れのidを組み合わせることができます.流れの変数に基づく検索を実行するのではなく、そのような方法は資源を消費しすぎます.
 
変数を使う
新しいフロー例が起動されると、オブジェクトパラメータのセットが提供されます.これらのパラメータをvariables変数に入れて、フローチャートの作成と起動時に使用することができます.
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("customer", "John Doe");
variables.put("type", "Accident");
variables.put("amount", new Float(763.74));

ProcessInstance processInstance =
    executionService.startProcessInstanceByKey("ICL", variables);
 
スタートinstanceをまとめてみます.
    instanceを起動するには、processdefinitionの情報を知る必要があります.processdefinitionは2つの方法で取得できます.
  • ByKey:ProcessKeyを通じて、このProcessの最新バージョン
  • を起動します.
  • ById:  ProcessのIDにより、このProcessの特定のバージョン
  • が起動される.
      その他のパラメータ:残りはInstanceを起動する時、フローに2つのパラメータを与えることもできます.
  • InstancerKey:このinstance Keyは、フロー全体で定義されたすべてのバージョンの中で唯一でなければならない.ユーザーが提供してくれないなら、システムも自分で生成する.
  • Map表:起動フロー時に与えられる変数情報
  •  
     
    実行待ちの流れ
    1つのstateを使用して活動すると、実行(またはフロー例)は、stateに到達すると、signal(外部トリガとも呼ばれる)が現れるまで待機する.signalExecution方法はこのような場合に用いることができる.実行は、ID(文字列)を実行することによって参照されます.
     
    場合によっては、stateに到達する実行は、フローチャート自体である.しかし、これはいつもの状況ではないです.タイマーと同期の場合、フローはツリー形を実行するルートノードである.ですから、私たちはあなたのsignalが正しい流れの中で働いていることを確認しなければなりません.
     
    正しい実行を得るためのより良い方法は、state活動にイベントモニターを割り当てることです.
     
    <state name="wait">
      <on event="start">
        <event-listener class="org.jbpm.examples.StartExternalWork" />
      </on>
      ...
    </state>
    イベントモニターStartExternalWorkでは、それらの追加的な完了が必要な部分を実行することができます.このイベントモニターでは、execution.getId()を通じて、適切なプロセスIDが得られます.そのプロセスidは、追加の作業が完了すると、signalに提供するために必要となります.
    executionService.signalExecutionById(executionId);
     
    ここでは、プロセスIDを取得するために任意の(あまり推奨されていない)方式があり、フローがstateに達したとき.このような方法でのみ実行IDが得られます.どのjBPM APIが起動したかを知っていれば、プロセスはstateの活動に入ります.
    // assume that we know that after the next call
    // the process instance will arrive in state external work
    
    ProcessInstance processInstance =
      executionService.startProcessInstanceById(processDefinitionId);
    // or ProcessInstance processInstance =
    //  executionService.signalProcessInstanceById(executionId);
    
    Execution execution = processInstance.findActiveExecutionIn("external work");
    String executionId = execution.getId();
     上の解決方法と応用ロジックの連絡(あまり)を注意してください.
     
    説明:
    上記の段落は、よく見ていませんでしたが、Instanceの処理を後から知る必要があります.jPDLを理解してから、実際の例を作成する時も含めて、改めて理解します.