[jbpm]jbpm-examples その1

勉強するステップとしては、 http://d.hatena.ne.jp/tokobayashi/20120409 に書いたチュートリアル、続いて Eclipse で生成できる sample (簡単な hello worldJPA 版の2種類)、次に jbpm-examples が良さそうです。

jbpm-examples は、以下からダウンロードし、Eclipseにインポート。パッケージ毎にexampleが分かれていて、mainから実行できるようになっています。

http://sourceforge.net/projects/jbpm/files/jBPM%205/jbpm-5.2.0.Final/jbpm-5.2.0.Final-examples.zip/download

Looping

んー、ループするだけー。

これだけではつまらないので、小ネタを追加。

ゲートウェイの条件分岐(Constraints)のところは、ループに戻る方が

return i < count;

となっていたので、

new Exception().printStackTrace();
return i < count;

と突っ込んで、むりやりスタックトレースを吐かせてみました。

java.lang.Exception
	at com.sample.Process_com_sample_Looping.returnValueEvaluator0(Process_com_sample_Looping.java:8)
	at com.sample.Process_com_sample_LoopingReturnValueEvaluator0Invoker.evaluate(Process_com_sample_LoopingReturnValueEvaluator0Invoker.java:16)
	at org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator.evaluate(ReturnValueConstraintEvaluator.java:128)
	at org.jbpm.workflow.instance.node.SplitInstance.internalTrigger(SplitInstance.java:72)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)

	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:196)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:155)
	at org.jbpm.workflow.instance.node.ActionNodeInstance.triggerCompleted(ActionNodeInstance.java:55)
	at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:51)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)

	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:196)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:155)
	at org.jbpm.workflow.instance.node.JoinInstance.triggerCompleted(JoinInstance.java:152)
	at org.jbpm.workflow.instance.node.JoinInstance.internalTrigger(JoinInstance.java:52)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)

	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:196)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:155)
	at org.jbpm.workflow.instance.node.ActionNodeInstance.triggerCompleted(ActionNodeInstance.java:55)
	at org.jbpm.workflow.instance.node.ActionNodeInstance.internalTrigger(ActionNodeInstance.java:51)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)

	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:196)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:155)
	at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:49)
	at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:41)
	at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:122)

	at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35)
	at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:188)
	at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:303)
	at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:168)
	at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:138)
	at org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1082)
	at org.drools.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:318)
	at org.jbpm.examples.looping.LoopingExample.main(LoopingExample.java:26)

StatefulKnowledgeSessionImpl.startProcess()以降、ノードの遷移毎に NodeInstanceImpl.trigger -> 実体クラス.internalTrigger -> 実体クラス.triggerCompleted -> NodeInstanceImpl.triggerCompleted -> NodeInstanceImpl.triggerNodeInstance が一組で、分かりやすくスタックを積み上げていきます。ループするとさらに深くなっていきます。

MultiInstance

MultiInstanceとは、プロセス(サブプロセス)が複数インスタンス動作する、ということです。パラメータをリストで与えると、そのパラメータ分だけ、プロセスが実行されます。

この example は要Human Task Serviceです。start.demoしていない状態から始めるのなら、jbpm-installerディレクトリで

ant start.human.task

を実行しておきましょう。

MultipleInstanceExampleを実行すると、与えられた3つのパラメータ分、Human Taskが作成されます。プロセスはまだ終了していません。Eclipseの Human Task View を使って、ユーザ「sales-rep」のタスクを見ると3つのタスクがあるので、それぞれを Complete すると、プロセスが進み、最後に「Process completed」と出力されます。