5.2.7 BPMN連携ライブラリを利用した業務処理を実装する
BPMN連携ライブラリを利用した業務処理の実装例を示します。
案件などの検索はCSCIWのCIWServerクラスなどの参照系APIを使用します。案件の投入や作業の完了など更新系の処理をする場合は,BPMN連携ライブラリのAPIを使用します。
(1) 実装例1
CSCIWのCIWServerクラスなどの参照系APIを使用した場合の実装例を示します。
案件の投入や作業の完了などの更新系APIは使用しないで,BPMN連携ライブラリのAPIを使用します。
次の図のような販売業務ビジネスプロセスをBPMNエディタで定義した場合,案件を投入すると,このビジネスプロセスは開始されます。
例
-
案件の投入
案件を投入する場合の業務アプリケーションの実装例を次に示します。
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) { // 例外処理を記述 }
-
作業を検索して完了
作業を検索して,検索した作業の着手と完了を実行する場合の業務アプリケーションの実装例を次に示します。
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) { // 例外処理を記述 }
-
メッセージの受信待ちの作業の検索
メッセージの受信待ちの作業一覧を取得する場合の業務アプリケーションの実装例を次に示します。
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エディタで定義した場合,案件(メッセージ)を投入すると,このビジネスプロセスは開始されます。
例
-
案件の投入(メッセージ)
案件投入(メッセージ)をする場合の業務アプリケーションの実装例を次に示します。
業務処理の入力項目は,次のとおりです。
-
ビジネスプロセス定義名
-
案件名(案件キー)
-
フローノード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) { // 例外処理を記述 }
-
-
「実行開始可能」のフローノードを検索してフローノード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) { // 例外処理を記述 }
-
-
「実行開始可能」のフローノードを検索して案件名を取得
「実行開始可能」のフローノードを検索して,検索したフローノードが所属する案件の案件名を取得する場合の業務アプリケーションの実装例を次に示します。
業務処理の入力項目は,次のとおりです。
-
ビジネスプロセス定義名
-
フローノード名(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) { // 例外処理を記述 }
-
-
「実行開始可能」のフローノードを検索して着手と完了
「実行開始可能」のフローノードを検索して,検索したフローノードに対応する作業の着手と完了をする場合の業務アプリケーションの実装例を次に示します。
業務処理の入力項目は,次のとおりです。
-
ビジネスプロセス定義名
-
案件名(案件キー)
-
フローノード名(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) { // 例外処理を記述 }
-
-
メッセージの送信
フローノードの検索をして,検索したフローノードに対してメッセージを送信する場合の業務アプリケーションの実装例を次に示します。
業務処理の入力項目は,次のとおりです。
-
ビジネスプロセス定義名
-
案件名(案件キー)
-
フローノード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) { // 例外処理を記述 }
-