说说 jBPM 流程定义语言(3)—— state 活动 (状态活动)

当需要使业务流程受到某些特定的外部干预处理后再继续进行,而在外部干预之前,流程会处于一个中断等待的状态,这时就使用到 state 活动。当流程运行到 state 活动时,就会自动陷入等待状态(waitting state),也就是说流程引擎在收到外部触发信号之前,会让流程实例在这个 state 活动持续等待。

state 活动除了最基本的 name 属性和 transition 等元素之外,没有其他的属性或元素。

我们设计一个 state 串行序列的流程:

state 串行序列

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

<process key="StateSequence" name="StateSequence" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="297,123,48,48" name="start1">
      <transition g="-29,-9" name="to a" to="a"/>
   </start>
   <state g="271,205,92,52" name="a">
      <transition g="-28,-11" name="to b" to="b"/>
   </state>
   <state g="269,290,92,52" name="b">
      <transition g="-32,-11" name="to c" to="c"/>
   </state>
   <state g="267,361,92,52" name="c"/>
</process>

然后编写代码让这个流程实例运行流转起来:

//发起实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
                ("StateSequence");

//触发流程走到下一步
Execution executionInA = processInstance.findActiveExecutionIn("a");
assertNotNull(executionInA);//在 a 节点

//发出执行信号
processInstance=executionService.signalExecutionById(executionInA.getId());
Execution executionInB=processInstance.findActiveExecutionIn("b");
assertNotNull(executionInB);//在 b 节点

//发出执行信号
processInstance=executionService.signalExecutionById(executionInB.getId());
Execution executionInC=processInstance.findActiveExecutionIn("c");
assertNotNull(executionInC);//在 c 节点

在 state 活动中可以定义多个 transition 元素,我们可以通过信号来传输指定转移路径的名称,这样就可以选择其中的一条 transition 来流转咯。

 选择 state 转移

对应的 XML:

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

<process key="StateChoice" name="StateChoice" xmlns="http://jbpm.org/4.4/jpdl">
   <start g="349,74,48,48" name="start1">
      <transition to="等待响应"/>
   </start>
   <state g="283,151,174,52" name="等待响应">
      <transition g="262,176:-47,-18" name="同意" to="提交文档"/>
      <transition g="476,176:25,-15" name="拒绝" to="再试一次吧"/>
   </state>
   <state g="190,247,147,52" name="提交文档"/>
   <state g="432,252,92,52" name="再试一次吧"/>
</process>

测试代码:

//发起实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey
        ("StateChoice");

Set<String> activities=processInstance.findActiveActivityNames();

//获取流程实例的 ID
String executionId = processInstance.findActiveExecutionIn("等待响应").getId();

//触发 accept 信号
processInstance = executionService.signalExecutionById(executionId, "同意");
assertTrue(processInstance.isActive("提交文档"));

如果使用 “拒绝” 作为信号传入 signalExecutionById(),那么流程将会流向 “再试一次吧” 的活动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值