说说 jBPM 流程定义语言(6)—— end (结束活动)

版权声明:如果喜欢,就点个赞呗 O(∩_∩)O~ https://blog.csdn.net/deniro_li/article/details/79295767

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 活动,这样可以通过事件机制来触发不同的结束方式:

多个 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());
展开阅读全文

没有更多推荐了,返回首页