Hitachi

uCosminexus Service Coordinator Interactive Workflow AP開発ガイド


2.3.5 CSCIWを利用した業務処理の実装

CSCIWを利用した業務処理の実装例を示します。

〈この項の構成〉

(1) 案件の投入

案件を投入する場合の業務プログラムのコーディング例を次に示します。なお,例中の「server」は,CIWServerオブジェクトを示します。

try {
    // 案件名「案件1」を指定して,ビジネスプロセス定義
    // 「ビジネスプロセス定義1」の案件を投入する。
    Map<CIWProcessInstance.AttributeName, Object> attributes
        = new HashMap<CIWProcessInstance.AttributeName, Object>();
    attributes.put(
        CIWProcessInstance.AttributeName.NAME,
        "案件1");
 
    CIWProcessInstance processInstance = server
        .createAndStartProcessInstance(
            attributes,
            "ビジネスプロセス定義1",
            null);
    …
}
catch(CIWFatalException e) {
    // 例外処理を記述
}
…

(2) 作業一覧の取得

作業一覧を取得する場合の業務プログラムのコーディング例を次に示します。なお,例中の「server」は,CIWServerオブジェクトを示します。

try {
    // 作業者IDが「User001」かつ「実行開始可能」状態の作業を
    // 生成日時の降順に取得する。
    EnumSet<CIWWorkItem.AttributeName> attributeNames
        = EnumSet.allOf(CIWWorkItem.AttributeName.class);
    List<CIWWorkItem> wiList = server.getWorkItemsList(
        "Participant = 'User001' AND StateCode = '"
            + CIWWorkItem.State.READY.toStateCode() + "'",
        "CreationDate DESC",
        0,
        -1,
        attributeNames);
    …
}
catch(CIWFatalException e) {
    // 例外処理を記述
}
…

(3) 作業の開始と終了

作業を開始および終了する場合の業務プログラムのコーディング例を次に示します。なお,例中の「wi」は,CIWWorkItemオブジェクトを示します。

try {
    // 作業を「実行開始可能」状態から「作業者実行」状態にして「実行済み」
    // 状態にする。
    // 既に「作業者実行」状態の作業の場合は,completeメソッドを使用する。
    wi.performAndComplete();
    …
}
catch(CIWTransientException e) {
    // 例外処理を記述
}
…

(4) 条件に一致する作業の作業者割り当てと着手をする場合の実装例

条件に一致する作業の作業者割り当てと着手をする場合の実装について説明します。

CIWServerクラスのallocateWorkItemExメソッドとCIWWorkItemクラスのfreeメソッドを利用します。クラス,およびメソッドの詳細については,次の個所を参照してください。

次の条件を満たす実装例を示します。

// 条件に一致する作業に作業者を割り当てて着手する(作業者は"TargetWorker",状態は"作業者実行"になる)
// フィルター条件「作業者が"SharedWork", 優先度が1以上」
// ソート条件「作業作成日が小さい(古い日時)順」
String newParticipant = "TargetWorker";
String filter =" Participant = 'SharedWork' AND Priority >= 1 ";
String sort =" CreationDate ASC ";
EnumSet<CIWWorkItem.AttributeName> attributeNames = EnumSet.allOf(CIWWorkItem.AttributeName.class);
 
CIWWorkItem wi = ciwServer.allocateWorkItemEx(
      newParticipant,
      filter,
      sort,
      attributeNames,
      20);
 
// トランザクションをコミットする
connection.commit();
 
/** 何らかの業務処理をする **/
 
// 処理の結果(boolean  result)で処理を分岐
if(result) {
           // 処理が成功したので,作業を実行済にする
           wi.changeState(CIWWorkItem.State.EXECUTED);
} else {
          // 処理が失敗したので,作業を返却して振り分けルールを再評価する
          wi.free();
}
connection.commit();