end 活动用于终结流程。
一般情况下,当流程实例运行到 end 活动后就会结束。但是在到达 end 活动的流程实例中仍然活跃的流程活动(fork - join 并发流转)可以继续执行。
这是一个最简单的包含 end 活动的流程定义:
jPDL:
<?xml version="1.0" encoding="UTF-8"?>
<process name="EndProcessInstance" xmlns="http://jbpm.org/4.4/jpdl" key="EndProcessInstance">
<start name="start1" g="414,129,48,48">
<transition to="end1"/>
</start>
<end name="end1" g="548,130,48,48"/>
</process>
测试代码:
//发起实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
("EndProcessInstance");
//断言流程结束
assertTrue(processInstance.isEnded());
在 jBPM4 中,流程定义允许多个 end 活动,如果需要在执行到特定的 end 活动时,完全结束流程实例,即其他仍然活跃的并发活动也需要结束,那么,可以设置end活动的属性 “ends="execution"” 来实现这种需求。默认的 ends 属性值为 processinstance。
也可以定义多个 end 活动,这样可以通过事件机制来触发不同的结束方式:
jPDL:
<?xml version="1.0" encoding="UTF-8"?>
<process key="EndMultiple" name="EndMultiple" xmlns="http://jbpm.org/4.4/jpdl">
<start g="201,210,48,48" name="start1">
<transition to="获取返回码"/>
</start>
<state g="292,208,124,52" name="获取返回码">
<transition g="351,166:72,-26" name="200" to="ok"/>
<transition g="-7,-26" name="400" to="bad request"/>
<transition g="356,306:76,-28" name="500" to="internal server error"/>
</state>
<end g="522,139,48,48" name="ok"/>
<end g="523,208,48,48" name="bad request"/>
<end g="522,283,48,48" name="internal server error"/>
</process>
测试代码:
//发起实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
("EndMultiple");
String executionId = processInstance.getId();
processInstance = executionService.signalExecutionById(executionId, "400");//指定转移名称
//断言流程结束
assertTrue(processInstance.isEnded());
在实际应用中,我们经常需要知道流程实例是以何种 “状态” 结束的。为了表明流程实例的结束状态,可以利用 end 活动的 state 属性标识,或者直接利用 jBPM4 提供的特殊 end 活动:end-cancel 活动和 end-error 活动。
属性 | 类型 | 默认值 | 是否必需 | 描述 |
---|---|---|---|---|
state | String | 可选 | state 用来自定义流程实例的状态。可以通过processInstance.getState() 获取。 |
下面定义了一个拥有不同 end 状态的流程定义:
jPDL:
<?xml version="1.0" encoding="UTF-8"?>
<process key="EndState" name="EndState" xmlns="http://jbpm.org/4.4/jpdl">
<start g="201,210,48,48" name="start1">
<transition to="获取返回码"/>
</start>
<state g="292,208,124,52" name="获取返回码">
<transition g="354,159:-22,-21" name="200" to="ok"/>
<transition g="-1,-24" name="400" to="cancel1"/>
<transition g="356,314:14,-19" name="500" to="error1"/>
</state>
<end g="548,137,48,48" name="ok" state="completed"/>
<end-cancel g="545,213,48,48" name="cancel1"/>
<end-error g="542,291,48,48" name="error1"/>
</process>
测试代码:
//发起实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
("EndState");
String executionId = processInstance.getId();
processInstance = executionService.signalExecutionById(executionId, "200");//指定转移名称
//断言流程的实例状态与预期相符
assertEquals("completed", processInstance.getState());
assertTrue(processInstance.isEnded());