jBPMのハンドラにパラメータを渡す

こんばんは、平田です。

jBPMでタスクを担当者にアサインするには、AssignmentHandlerを実装する必要があります。
このハンドラオブジェクトに、JPDLからパラメータを渡してみます。

例えば、指定部署のスタッフにアサインする汎用的なハンドラAssignToDeptを作りたいとします。

JPDLのactionassignmentなどのプログラミングロジックを組み込む部分には、当該XMLタグの子要素の値をオブジェクトにセットするという豪快な仕組みが用意されています。

<!-- Fooオブジェクトのbarフィールド、bazフィールドに値がセットされる -->
<action class="Foo"/>
  <bar>bar value</bar>
  <baz>baz value</baz>
</action>

この仕組みを利用して、AssignToDeptに部署を指定します。

public class TestPassParams extends TestCase {

    public static class AssignToDept implements AssignmentHandler {
        static Map<String, String[]> DEPTS = new HashMap<String, String[]>();
        static {
            DEPTS.put("営業部", new String[] {
                    "なかい", "きむら", "いながき", "くさなぎ", "かとり" });
            DEPTS.put("経理部", new String[] {
                    "おおの", "さくらい", "あいば", "にのみや", "まつもと" });
        }

        String dept;
        
        @Override
        public void assign(Assignable task, ExecutionContext exeCtx) throws Exception {
            task.setPooledActors(DEPTS.get(dept));
        }
    }

    public void test経理部にアサインする() {
        Collection<String> keiri = Arrays.asList(AssignToDept.DEPTS.get("経理部"));

        ProcessDefinition denpyoProcessDef = ProcessDefinition.parseXmlString(
                "<process-definition>" +
                "  <start-state>" +
                "    <transition to='伝票処理'/>" +
                "  </start-state>" +
                "  <task-node name='伝票処理'>" +
                "    <task>" +
                "      <assignment class='com.natswell.jbpm.tips.TestPassParams$AssignToDept' >" +
                "        <dept>経理部</dept>" +
                "      </assignment>" +
                "    </task>" +
                "    <transition to='end'/>" +
                "  </task-node>" +
                "  <end-state name='end'/> " +
                "</process-definition> ");
        
        ProcessInstance denpyoProcess = do開始(denpyoProcessDef);

        {
            TaskInstance denpyoTask
                = denpyoProcess.getTaskMgmtInstance().getTaskInstances().iterator().next();
            for (PooledActor each : denpyoTask.getPooledActors()) {
                assertTrue("伝票処理タスクの担当者は経理部のはず",
                        keiri.contains(each.getActorId()));
            }
            denpyoTask.end();
        }
        
        assertTrue(denpyoProcess.hasEnded());
    }

    private ProcessInstance do開始(ProcessDefinition def) {
        ProcessInstance denpyoProcess = new ProcessInstance(def);
        Token token = denpyoProcess.getRootToken();
        token.signal();
        return denpyoProcess;
    }
}

deptタグを使って部署を指定することができました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です