勉強するステップとしては、 http://d.hatena.ne.jp/tokobayashi/20120409 に書いたチュートリアル、続いて Eclipse で生成できる sample (簡単な hello world と JPA 版の2種類)、次に jbpm-examples が良さそうです。
jbpm-examples は、以下からダウンロードし、Eclipseにインポート。パッケージ毎にexampleが分かれていて、mainから実行できるようになっています。
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」と出力されます。