Request
これは予想外のてんこもりサンプル。いきなり adHocSubProcess です。
さらにHumanTaskのWorkItemHandlerにSwingのJFrameが!なるほど、クライアントUIと一緒にするという手もあるか。でも普通はWorkItemHandlerはtaskをaddするだけで、クライアントと切り離すはず。
UIWorkItemHandler handler = new UIWorkItemHandler(); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler); handler.setVisible(true);
ksession.getWorkItemManager().registerWorkItemHandler("Email", new WorkItemHandler() { public void executeWorkItem(WorkItem workItem, WorkItemManager manager) { System.out.println("Sending email ..."); manager.completeWorkItem(workItem.getId(), null); } public void abortWorkItem(WorkItem workItem, WorkItemManager manager) { } });
process instanceをfactとしてksessionにinsertする。これで、process instanceの情報にルール内でアクセスできる。これは推奨される使い方なのか微妙な気がする。
WorkflowProcessInstance processInstance = (WorkflowProcessInstance) ksession.startProcess("com.sample.requestHandling", params); ksession.insert(processInstance);
adHocSubProcess内のノードはksession.signalEvent()で呼び出す。
ksession.signalEvent("Investigate", null, processInstance.getId());
ルールから呼んだりもできる。素人にはおすすめできない。
kcontext.getKnowledgeRuntime().signalEvent("Review", null, p.getId());
動的にサブプロセスを追加。うーん、こういうユースケースがあるのは理解できるけど、乱用したら管理不能になりそうだ。
DynamicNodeInstance dynamicNodeInstance = (DynamicNodeInstance)processInstance.getNodeInstances().iterator().next(); DynamicUtils.addDynamicSubProcess(dynamicNodeInstance, ksession, "com.sample.contactCustomer", null);
最後にProcessStartedEventをksessionにinsertして、プロセススタートをルールでカウントするテスト。
ksession.addEventListener(new DefaultProcessEventListener() { public void beforeProcessStarted(ProcessStartedEvent event) { ksession.insert(event); } }); ksession.startProcess("com.sample.requestHandling"); ksession.fireAllRules(); ksession.startProcess("com.sample.requestHandling"); ksession.fireAllRules(); ...