Hitachi

uCosminexus Service Coordinator Interactive Workflow BPMN連携機能 使用の手引


5.2.7 BPMN連携ライブラリを利用した業務処理を実装する

BPMN連携ライブラリを利用した業務処理の実装例を示します。

案件などの検索はCSCIWのCIWServerクラスなどの参照系APIを使用します。案件の投入や作業の完了など更新系の処理をする場合は,BPMN連携ライブラリのAPIを使用します。

〈この項の構成〉

(1) 実装例1

CSCIWのCIWServerクラスなどの参照系APIを使用した場合の実装例を示します。

案件の投入や作業の完了などの更新系APIは使用しないで,BPMN連携ライブラリのAPIを使用します。

次の図のような販売業務ビジネスプロセスをBPMNエディタで定義した場合,案件を投入すると,このビジネスプロセスは開始されます。

図5‒1 販売業務ビジネスプロセス

[図データ]

  1. 案件の投入

    案件を投入する場合の業務アプリケーションの実装例を次に示します。

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 以下を指定してビジネスプロセス定義「販売業務ビジネスプロセス」の案件を投入
        // 案件名「案件1」
        // プロセスデータ(プロセスデータキー名「$NPrice」,プロセスデータ値「50000」)
        Map<CIWProcessInstance.AttributeName, Object> attributes 
            = new HashMap<CIWProcessInstance.AttributeName, Object>();
        attributes.put(
            CIWProcessInstance.AttributeName.NAME,
            "案件1");
        Collection<CIWBPMNProcessData<?>> pdlist 
            = new ArrayList<CIWBPMNProcessData<?>>();
        pdlist.add(CIWBPMNProcessDataFactory.createProcessData(
            "$NPrice ",
            Integer.valueOf(50000)));
        CIWProcessInstance processInstance = bpmnlib.createAndStartPI(
            connection,
            server,
            "販売業務ビジネスプロセス",
            null,
            attributes,
            pdlist);
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }
  2. 作業を検索して完了

    作業を検索して,検索した作業の着手と完了を実行する場合の業務アプリケーションの実装例を次に示します。

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 作業者IDが「見積担当者」かつ「実行開始可能」状態の作業を取得
        EnumSet<CIWWorkItem.AttributeName> attributeNames
            = EnumSet.allOf(CIWWorkItem.AttributeName.class);
        List<CIWWorkItem> wiList = server.getWorkItemsList(
            "Participant = '見積担当者' AND StateCode = '"
                + CIWWorkItem.State.READY.toStateCode() + "'",
            null,
            0,
            1,
            attributeNames);
        // 以下を指定して作業の着手と完了
        // プロセスデータ(プロセスデータキー名「$SExaminationResult」,プロセスデータ値「OK」)
        Collection<CIWBPMNProcessData<?>> pdlist 
            = new ArrayList<CIWBPMNProcessData<?>>();
        pdlist.add(
            CIWBPMNProcessDataFactory.createProcessData(
                "$SExaminationResult ",
                "OK"));
        if(wiList.size() > 0) {
            bpmnlib.performAndCompleteWI(
                connection,
                server,
                wiList.get(0).getProcessInstanceID(),
                wiList.get(0).getID(),
                pdlist);
        }
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }
  3. メッセージの受信待ちの作業の検索

    メッセージの受信待ちの作業一覧を取得する場合の業務アプリケーションの実装例を次に示します。

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // messageRefが「msgref002」で受信待ちしている作業一覧を取得
        EnumSet<CIWWorkItem.AttributeName> attributeNames
            = EnumSet.allOf(CIWWorkItem.AttributeName.class);
        List<CIWWorkItem> wiList = server.getWorkItemsList(
            "Participant = 'IWRMSG_msgref002' AND " + 
            "StateCode = '"+ CIWWorkItem.State.READY.toStateCode() + "'",
            null,
            0,
            -1,
            attributeNames);
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }

(2) 実装例2

BPMN連携ライブラリの参照系APIを使用した場合の実装例を示します。

案件の投入や作業の完了などの更新系APIは使用しないで,BPMN連携ライブラリのAPIを使用します。

次の図のような販売業務ビジネスプロセスをBPMNエディタで定義した場合,案件(メッセージ)を投入すると,このビジネスプロセスは開始されます。

図5‒2 販売業務ビジネスプロセス

[図データ]

  1. 案件の投入(メッセージ)

    案件投入(メッセージ)をする場合の業務アプリケーションの実装例を次に示します。

    業務処理の入力項目は,次のとおりです。

    • ビジネスプロセス定義名

    • 案件名(案件キー)

    • フローノードID(BPMN要素のid属性値)

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 以下を指定して該当するフローノードのref識別子を取得
        // ビジネスプロセス定義名「販売業務ビジネスプロセス」
        // フローノードID「MsgStart1」
        List<CIWBPMNFlowNodeDefinition> fnDefinitionList = bpmnlib.getFlowNodeDefinitionsList(
            connection,
            server,
            "販売業務ビジネスプロセス",
            "MsgStart1",
            null,
            null);
        …
        switch(fnDefinitionList.get(0).getFlowNodeType()) {
            case MESSAGE_TOPSTART:
                // フローノードが開始(メッセージ)の場合,以下を指定して
                // 案件投入(メッセージ)を実行
                // ビジネスプロセス定義名「販売業務ビジネスプロセス」
                // 案件名「案件1」
                // MessageRef(取得したref識別子)
                Map<CIWProcessInstance.AttributeName, Object> attributes 
                    = new HashMap<CIWProcessInstance.AttributeName, Object>();
                attributes.put(
                    CIWProcessInstance.AttributeName.NAME,
                    "案件1");
                Collection<CIWBPMNProcessData<?>> pdlist 
                    = new ArrayList<CIWBPMNProcessData<?>>();
                pdlist.add(CIWBPMNProcessDataFactory.createProcessData(
                    "$NPrice",
                    Integer.valueOf(50000)));
                CIWProcessInstance processInstance = bpmnlib.startMessage(
                    connection,
                    server,
                    "販売業務ビジネスプロセス",
                    null,
                    attributes,
                    null,
                    fnDefinitionList.get(0).getFlowNodeRefID());
        }
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }
  2. 「実行開始可能」のフローノードを検索してフローノードIDとフローノード名を取得

    「実行開始可能」のフローノードを検索して,検索したフローノードのフローノードID(BPMN要素のid属性値)とフローノード名(BPMN要素のname属性値)を取得する場合の業務アプリケーションの実装例を次に示します。

    業務処理の入力項目は,次のとおりです。

    • ビジネスプロセス定義名

    • 案件名(案件キー)

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 以下を指定して「実行中」の案件を取得
        // ビジネスプロセス定義名「販売業務ビジネスプロセス」
        // 案件名「案件1」
        EnumSet<CIWProcessInstance.State> pistates = EnumSet.of(
            CIWProcessInstance.State.RUNNING);
        List<CIWProcessInstance> pilist = bpmnlib.getProcessInstancesListByPIName(
            connection,
            server,
            "販売業務ビジネスプロセス",
            "案件1",
            pistates,
            null); 
        // 以下を指定して「実行開始可能」状態のフローノードを取得
        // 案件ID(取得した案件のID)
        EnumSet<CIWWorkItem.State> wistates
            = EnumSet.of(CIWWorkItem.State.READY);
        List<CIWBPMNFlowNodeInstance> fnlist = bpmnlib.getFlowNodeInstancesListByPIID(
            connection,
            server,
            pilist.get(0).getID(),
            null,
            null,
            wistates,
            null,
            null);
        // フローノードIDとフローノード名を取得
        fnlist.get(0).getFlowNodeID();
        fnlist.get(0).getFlowNodeName();
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }
  3. 「実行開始可能」のフローノードを検索して案件名を取得

    「実行開始可能」のフローノードを検索して,検索したフローノードが所属する案件の案件名を取得する場合の業務アプリケーションの実装例を次に示します。

    業務処理の入力項目は,次のとおりです。

    • ビジネスプロセス定義名

    • フローノード名(BPMN要素のname属性値)

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 以下を指定して「実行開始可能」状態のフローノードを取得
        // ビジネスプロセス定義名「販売業務ビジネスプロセス」
        // フローノード名「見積中」
        EnumSet<CIWWorkItem.State> wistates
            = EnumSet.of(CIWWorkItem.State.READY);
        EnumSet<CIWBPMNFlowNodeInstance.AttributeName> attributeNames
            = EnumSet.of(
                    CIWBPMNFlowNodeInstance.AttributeName.PROCESS_INSTANCE_NAME);
        List<CIWBPMNFlowNodeInstance> fnlist = bpmnlib.getFlowNodeInstancesListByPDName(
            connection,
            server,
            "販売業務ビジネスプロセス",
            null,
            "見積中",
            wistates,
            null,
            attributeNames);
        // フローノードの案件名を取得
        fnlist.get(0).getProcessInstanceName();
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }
  4. 「実行開始可能」のフローノードを検索して着手と完了

    「実行開始可能」のフローノードを検索して,検索したフローノードに対応する作業の着手と完了をする場合の業務アプリケーションの実装例を次に示します。

    業務処理の入力項目は,次のとおりです。

    • ビジネスプロセス定義名

    • 案件名(案件キー)

    • フローノード名(BPMN要素のname属性値)

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 以下を指定して「実行中」状態の案件を取得
        // ビジネスプロセス定義名「販売業務ビジネスプロセス」
        // 案件名「案件1」
        EnumSet<CIWProcessInstance.State> pistates
            = EnumSet.of(CIWProcessInstance.State.RUNNING);
        List<CIWProcessInstance> pilist = bpmnlib.getProcessInstancesListByPIName(
            connection,
            server,
            "販売業務ビジネスプロセス",
            "案件1",
            pistates,
            null);
        // 以下を指定して「実行開始可能」状態のフローノードを取得
        // 案件ID(取得した案件のID)
        // フローノード名「見積中」
        EnumSet<CIWWorkItem.State> wistates
            = EnumSet.of(CIWWorkItem.State.READY);
        List<CIWBPMNFlowNodeInstance> fnlist = bpmnlib.getFlowNodeInstancesListByPIID(
            connection,
            server,
            pilist.get(0).getID(),
            null,
            "見積中",
            wistates,
            null,
            null);
        // 以下を指定して作業の着手と完了
        // 案件ID(取得したフローノードの案件ID)
        // 作業ID(取得したフローノードの作業ID)
        // プロセスデータ(プロセスデータキー名「$SExaminationResult」,
        //                 プロセスデータ値「OK」)
        Collection<CIWBPMNProcessData<?>> pdlist 
            = new ArrayList<CIWBPMNProcessData<?>>();
        pdlist.add(
            CIWBPMNProcessDataFactory.createProcessData(
                "$SExaminationResult",
                "OK"));
        bpmnlib.performAndCompleteWI(
            connection,
            server,
            fnlist.get(0).getProcessInstanceID(),
            fnlist.get(0).getWorkItemID(),
            pdlist);
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }
  5. メッセージの送信

    フローノードの検索をして,検索したフローノードに対してメッセージを送信する場合の業務アプリケーションの実装例を次に示します。

    業務処理の入力項目は,次のとおりです。

    • ビジネスプロセス定義名

    • 案件名(案件キー)

    • フローノードID(BPMN要素のid属性値)

    try {
        // コネクションの取得および自動コミットのOFF
        …
        CIWServer server = factory.createCIWServer("User");
        CIWConnectionCoordinator coordinator = server.getConnectionCoordinator();
        coordinator.attachDatabaseConnection(connection);
        …
        // 以下を指定して該当するフローノード定義のref識別子を取得
        // ビジネスプロセス定義名「販売業務ビジネスプロセス」
        // フローノードID「MsgCatch1」
        List<CIWBPMNFlowNodeDefinition> fnDefinitionList = bpmnlib.getFlowNodeDefinitionsList(
            connection,
            server,
            "販売業務ビジネスプロセス",
            "MsgCatch1",
            null,
            null);
        …
        switch(fnDefinitionList.get(0).getFlowNodeType()) {
            case MESSAGE_CATCH:
                // フローノードがキャッチ(メッセージ)の場合,以下を指定して
                // 「実行中」の案件を取得
                // ビジネスプロセス定義名「販売業務ビジネスプロセス」
                // 案件名「案件1」
                EnumSet <CIWProcessInstance.State> pistates = EnumSet.of(
                    CIWProcessInstance.State.RUNNING);
                List<CIWProcessInstance> pilist = 
                                       bpmnlib.getProcessInstancesListByPIName(
                    connection,
                    server,
                    "販売業務ビジネスプロセス",
                    "案件1",
                    pistates,
                    null); 
                // 取得した案件に対して,以下を指定してメッセージを送信
                // 案件ID(取得した案件のID)
                // プロセスデータ(プロセスデータキー名「$NPrice」,
                //                 プロセスデータ値「50000」)
                // MessageRef(取得したフローノード定義のref識別子)
                Collection<CIWBPMNProcessData<?>> pdlist 
                    = new ArrayList<CIWBPMNProcessData<?>>();
                pdlist.add(CIWBPMNProcessDataFactory.createProcessData(
                    "$NPrice",
                    Integer.valueOf(50000)));
                bpmnlib.sendMessage (
                    connection,
                    server,
                    pilist.get(0).getID(),
                    pdlist, 
                    fnDefinitionList.get(0).getFlowNodeRefID());
        }
        …
        coordinator.detachDatabaseConnection();
        // トランザクションの終了処理
        …
    }
    catch(CIWException e) {
        // 例外処理を記述
    }