jbpm-examples その4

Request

これは予想外のてんこもりサンプル。いきなり adHocSubProcess です。

さらにHumanTaskのWorkItemHandlerにSwingのJFrameが!なるほど、クライアントUIと一緒にするという手もあるか。でも普通はWorkItemHandlerはtaskをaddするだけで、クライアントと切り離すはず。

UIWorkItemHandler handler = new UIWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", handler);
handler.setVisible(true);


Emailタスクがあるかと思いきやなんちゃってハンドラー

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

最後に超重要なexample。src/main/resources/junit の下に多数のプロセス例があり、そのユニットテストです。個別の機能の実装サンプルや動作確認をしたい場合にかなり有用だと思われます。bpmnファイルをみるときは、Eclipseではなくて、GuvnorのWebエディタ(process-designer)を使うことを推奨します。(Eclipseのエディタでは見えないプロパティがある)