jbpm学习笔记(六) jbpm的核心 jpdl流程定义语言详解(一)
jpdl是jbpm的最核心,涉及到各方面的内容,所以我打算用多篇博文记录它
一, Jpdl语言是以xml为表现形式的,根元素是process,我们看看process元素的一些属性
<?xml version="1.0" encoding="UTF-8"?><process name="angel" xmlns="http://jbpm.org/4.4/jpdl"><!-- 流程开始后转移到wait for response state --><start><transition to="wait for response" /></start> <!-- 这里有两个transition供选择,二者选其一 --><state name="wait for response"><transition name="accept" to="submit document" /><transition name="reject" to="try again" /></state><!-- 此活动被上面名为accept 的transition指向 --><state name="submit document" /><!-- 此活动被上面名为reject 的transition指向 --><state name="try again" /></process>
下面我们编写代码使此流程运行起来,首先根据此流程定义发起实例:
ProcessInstance processInstance=executionService.startProcessInstanceByKey(“StateChoice”);
//获取流程执行的ID String executionId=processInstance.findActiveExecutionIn(“wait for response”).getId(); //触发accept型号 processInstance=executionService.signalExecutionById (executionId,”accept”); assertTrue(processInstance.isActive(“submit document”));
<?xml version="1.0" encoding="UTF-8"?><process name="decisionConditions" xmlns="http://jbpm.org/4.4/jpdl"><start><transition to="decisionGo" /></start> <!-- "#{content}" 即为判断表达式。在这里会返回变量content的字符串值 --> <decision name="decisionGo"> <!-- content 值为good时的转移 --> <transition to="submit" > <condition expr="#{content=='good'}"/> </transition> <!-- content 值为bad时的转移 --> <transition to="try again" > <condition expr="#{content=='bad'}"/> </transition> <!-- content 值为ugly时的转移 --> <transition to="give up" > <condition expr="#{content=='ugly'}"/> </transition> </decision> <state name="submit" /> <state name="try again" /> <state name="give up" /> </process>
Map<String,Object> vals=new HashMap<String, Object> ();vals.put("content","good");//发起流程实例ProcessInstance processInstance=executionService.startProcessInstanceByKey("decisionConditions",vals);//那么,可以断言流程实例流向了submit活动assertTrue(processInstance.isActive("submit"));
<?xml version="1.0" encoding="UTF-8"?><process name="decisionExpr" xmlns="http://jbpm.org/4.4/jpdl"><start><transition to="decisionGo" /></start> <!-- "#{content}" 即为判断表达式。在这里会返回变量content的字符串值 --> <decision expr="#{content}" name="decisionGo"> <!-- content 值为good时的转移 --> <transition name="good" to="submit" /> <!-- content 值为bad时的转移 --> <transition name="bad" to="try again" /> <!-- content 值为ugly时的转移 --> <transition name="ugly" to="give up" /> </decision> <state name="submit" /> <state name="try again" /> <state name="give up" /> </process>
Map<String,Object> vals=new HashMap<String, Object>();vals.put("content","good");//发起流程实例ProcessInstance processInstance=executionService.startProcessInstanceByKey("decisionExpr",vals); /那么,可以断言流程实例流向了submit活动assertTrue(processInstance.isActive("submit"));
<?xml version="1.0" encoding="UTF-8"?><process name="decisionTest" xmlns="http://jbpm.org/4.4/jpdl"><start><transition to="decisionGoHandler" /></start> <decision name="decisionGoHandler"> <!-- 所有的流转判断逻辑都被委派给了这个ContentEvaluation handler 统一处理 --> <handler /> <transition name="good" to="submit"/> <transition name="bad" to="try again"/> <transition name="ugly" to="give up"/> </decision> <state name="submit" /> <state name="try again" /> <state name="give up" /> </process>ContentEvaluation这个类的代码如下:
package org.test;import org.jbpm.api.jpdl.DecisionHandler;import org.jbpm.api.model.OpenExecution;public class ContentEvaluation implements DecisionHandler {@Overridepublic String decide(OpenExecution execution) {String content = (String) execution.getVariable("content");if (content.equals("you are good")) {return "good";}if (content.equals("you are bad")) {return "bad";} return "ugly";}}运行流程实例的单元测试代码如下:
Map<String,Object> vals=new HashMap<String, Object>();//设置流程变量content的值为 you are goodvals.put("content","you are good");//发起流程实例,并设置流程变量ProcessInstance pi=executionService.startProcessInstanceByKey("decisionHandler",vals);//断言流向了预期的活动assertTrue(pi.isActive("submit"));