天天看點

JBPM4.4(2)-state結點和decision結點

做一個帶有分支的流向流程

JBPM4.4(2)-state結點和decision結點

在執行seperate狀态的時候分成了200和400兩種情況

描述檔案的内容如下:

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

View Code

<?xml version="1.0" encoding="UTF-8"?>

<process name="fork" xmlns="http://jbpm.org/4.4/jpdl">

<start g="237,28,48,48" name="start1">

<transition name="to separate" to="separate" g="-71,-17"/>

</start>

<state g="210,153,92,52" name="separate">

<transition name="to 200" to="200" g="-41,-17"/>

<transition name="to 400" to="400" g="-41,-17"/>

</state>

<state g="145,256,92,52" name="200">

<transition name="to end1" to="end1" g="-47,-17"/>

<state g="306,255,92,52" name="400">

<end g="245,375,48,48" name="end1"/>

</process>

測試代碼如下:

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

public class TestSperator extends JbpmTestCase {

String deploymentId;

protected void setUp() throws Exception {

super.setUp();

deploymentId = repositoryService.createDeployment()

.addResourceFromClasspath("com/jbpm/fork/fork.jpdl.xml")

.deploy();

}

protected void tearDown() throws Exception {

repositoryService.deleteDeploymentCascade(deploymentId);

super.tearDown();

public void testSeparate() {

ProcessInstance processInstance = executionService

.startProcessInstanceByKey("fork");

System.out.println("流程執行個體Id:" + processInstance.getId());

System.out.println("流程定義Id:" + processInstance.getProcessDefinitionId());

ProcessInstance instance = executionService.signalExecutionById(processInstance.getId());

// 判斷目前是否位于state節點

System.out.println("是否位于state節點:" + instance.isActive("separate"));

System.out.println("向下執行...");

ProcessInstance processInstance200=executionService.signalExecutionById(processInstance.getId(), "to 200");

System.out.println("目前流程是否位于200節點---->"+processInstance200.isActive("200"));

System.out.println("目前流程是否結束---->"+processInstance200.isEnded());

ProcessInstance endinstance=executionService.signalExecutionById(processInstance200.getId());

System.out.println("目前流程是否結束---->"+endinstance.isEnded());

執行流程的結果如下:

JBPM4.4(2)-state結點和decision結點

使流程向下執行

executionService.signalExecutionById();

該方法有多個重載:

ProcessInstance

signalExecutionById(String executionId);

//若在流程定義某一個節點沒有分支時(隻有一個transition時),調用此方法,可将流程繼續向下執行 executionId為流程執行個體Id

signalExecutionById(String executionId, String signalName);

//若在流程定義某一個節點有多個分支時(有多個transition時),調用此方法,可将流程沿着transition所指的方向向下執行

executionId為流程執行個體Id, signalName為流程定義中transition節點的name屬性的值

signalExecutionById(String executionId, String signalName, Map<String, ?>

parameters);

用于将流程沿着signalName方向(transition的name屬性所指的方向)向下繼續執行,在執行的過程中順便傳遞參數parameters

signalExecutionById(String executionId, Map<String, ?>

用于将流程向下繼續執行,在執行的過程中順便傳遞參數parameters

注:當一個節點有多個分支時,若要通過signalExecutionById()方法将流程向下執行必須明确指出signalName即(transition的name屬性所指的方向),否則流程不會向下執行,仍會停留在目前節點。因為jbpm不确定流程該流向那個方向。

接下來是一個decision的例子,這個是一個分支判斷的節點,相當于我們程式中的switch case

下面畫一個選擇向左還是向右的例子

JBPM4.4(2)-state結點和decision結點

定義檔案如下:

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

<process name="decision" xmlns="http://jbpm.org/4.4/jpdl">

<start g="246,30,48,48" name="start1">

<transition name="to wait" to="wait" g="-47,-17"/>

<state g="231,112,92,52" name="wait">

<transition name="to exclusive1" to="exclusive1" g="-83,-17"/>

<decision g="252,204,48,48" name="exclusive1">

<transition name="to left" to="left" g="-47,-17">

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

</transition>

<transition name="to right" to="right" g="-53,-17">

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

</decision>

<state g="175,295,92,52" name="left">

<state g="325,292,92,52" name="right">

<end g="268,370,48,48" name="end1"/>

其中有幾種方式可以處理流程的走向

第一種,内置條件

即在流程定義中設定每一個transition的子節點condition,并為每一個condition填充expr屬性

形如:

對應的測試流程如下,需要增加

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

Map<String, String> map=new HashMap<String, String>();

//coder為流程定義中表達式的名稱

map.put("coder", "left");

ProcessInstance processInstance = executionService.startProcessInstanceByKey("decision",map);

如果map中order的值指定的有問題那麼就會抛出異常

測試程式如下:

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

public class TestDecision extends JbpmTestCase {

.addResourceFromClasspath("com/jbpm/decision/decision.jpdl.xml")

public void testDescsion() {

System.out.println("是否位于state節點:" + processInstance.isActive("wait"));

ProcessInstance decisionInstance = executionService.signalExecutionById(processInstance.getId());

// 判斷目前是否位于wait節點

System.out.println("是否位于wait節點:" + decisionInstance.isActive("wait"));

System.out.println("因為已經有值是以自動向下執行...");

System.out.println("是否位于left節點:" + decisionInstance.isActive("left"));

//向下執行

ProcessInstance endinstance=executionService.signalExecutionById(decisionInstance.getId());

執行結果如圖所示:

JBPM4.4(2)-state結點和decision結點

因為在開始的時候指定了流程處理的方向,是以流程向left方向自動執行。

第二種,更像switch case

在decision節點上指定

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

修改代碼為:

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

map.put("toWhere", "to left");

其它部分不變,可以看到結果和原來的相同。

第三種,配置handler子類

在流程定義中在decision節點内部配置<handler/>子節點,并設定該元素的class屬性為你自己的類)該類實作了org.jbpm.api.jpdl.DecisionHandler.你需要重寫

String decide(OpenExecution

execution);方法即可,在該方法最終傳回decision活動後的下一個transition的name屬性的值。

修改配置檔案

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

<handler class="com.jbpm.decision.HandlerDecision"></handler>

添加HandlerDecision并且實作DecisionHandler

代碼如下:

JBPM4.4(2)-state結點和decision結點
JBPM4.4(2)-state結點和decision結點

@SuppressWarnings("serial")

public class HandlerDecision implements DecisionHandler {

@Override

public String decide(OpenExecution execution) {

// TODO Auto-generated method stub

String toWhere = execution.getVariable("toWhere").toString();

String result = null;

if ("left".equals(toWhere)) {

result = "to left";

} else if ("right".equals(toWhere)) {

result = "to right";

return result;

測試代碼隻需将map中的值進行簡單修改即可

map.put("toWhere", "left");

執行測試,得到的流程和之前完全相同。

繼續閱讀