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();
...
