天天看点

JBPM4.4(2)-state结点和decision结点

做一个带有分支的流向流程

JBPM4.4(2)-state结点和decision结点

在执行seperate状态的时候分成了200和400两种情况

描述文件的内容如下:

测试代码如下:

执行流程的结果如下:

JBPM4.4(2)-state结点和decision结点

使流程向下执行

executionservice.signalexecutionbyid();

该方法有多个重载:

processinstance signalexecutionbyid(string executionid);

//若在流程定义某一个节点没有分支时(只有一个transition时),调用此方法,可将流程继续向下执行 executionid为流程实例id

processinstance signalexecutionbyid(string executionid, string signalname);

//若在流程定义某一个节点有多个分支时(有多个transition时),调用此方法,可将流程沿着transition所指的方向向下执行

executionid为流程实例id, signalname为流程定义中transition节点的name属性的值

processinstance signalexecutionbyid(string executionid, string signalname, map<string, ?> parameters);

用于将流程沿着signalname方向(transition的name属性所指的方向)向下继续执行,在执行的过程中顺便传递参数parameters

processinstance signalexecutionbyid(string executionid, map<string, ?> parameters);

用于将流程向下继续执行,在执行的过程中顺便传递参数parameters

注:当一个节点有多个分支时,若要通过signalexecutionbyid()方法将流程向下执行必须明确指出signalname即(transition的name属性所指的方向),否则流程不会向下执行,仍会停留在当前节点。因为jbpm不确定流程该流向那个方向。

接下来是一个decision的例子,这个是一个分支判断的节点,相当于我们程序中的switch case

下面画一个选择向左还是向右的例子

JBPM4.4(2)-state结点和decision结点

定义文件如下:

其中有几种方式可以处理流程的走向

第一种,内置条件

即在流程定义中设置每一个transition的子节点condition,并为每一个condition填充expr属性

形如:

<condition expr="${coder=='left'}"></condition>

对应的测试流程如下,需要增加

如果map中order的值指定的有问题那么就会抛出异常

测试程序如下:

执行结果如图所示:

JBPM4.4(2)-state结点和decision结点

因为在开始的时候指定了流程处理的方向,所以流程向left方向自动执行。

第二种,更像switch case

在decision节点上指定

<decision g="252,204,48,48" name="exclusive1" expr="${towhere}">

修改代码为:

其它部分不变,可以看到结果和原来的相同。

第三种,配置handler子类

在流程定义中在decision节点内部配置<handler/>子节点,并设置该元素的class属性为你自己的类)该类实现了org.jbpm.api.jpdl.decisionhandler.你需要重写

string decide(openexecution execution);方法即可,在该方法最终返回decision活动后的下一个transition的name属性的值。

修改配置文件

添加handlerdecision并且实现decisionhandler

代码如下:

测试代码只需将map中的值进行简单修改即可