关于第七章 第7小结 JavaDelegate抛出错误事件问题?
来源:7-9 BPMN2.0服务任务-2
weixin_慕妹1504304
2020-11-24
老师,您好!
关于您在第7章 第七小结末尾 提出了 JavaDelegate抛出错误事件
* 
我在本地模仿上述流程图仿制了流程:

对应的流程文件:
<process id="my-process">
<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" />
<serviceTask id="someTask" name="Service Task"
activiti:delegateExpression="${myJavaDelegate}">
</serviceTask>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />
<endEvent id="end" />
<!-- 这里捕获在 javaDelegate中抛出的BpmnError -->
<boundaryEvent id="boundaryerror1" name="Error" attachedToRef="someTask">
<errorEventDefinition errorRef="bpmnErrorDemo"></errorEventDefinition>
</boundaryEvent>
<sequenceFlow id="flow3" sourceRef="boundaryerror1" targetRef="usertask1" />
<userTask id="usertask1" name="User Task"></userTask>
<sequenceFlow id="flow4" sourceRef="usertask1" targetRef="end2" />
<endEvent id="end2" />
</process>
对应的JavaDelegate:
@Override
public void execute(DelegateExecution execution) {
if (null != name){
// 从流程上下文中获取到参数 param(VariableScope)
Object nameValue = name.getValue(execution);
LOGGER.info("表达变量 name = {}", nameValue.toString());
}
if (null != desc){
// 从流程上下文中获取到参数 param(VariableScope)
Object descValue = name.getValue(execution);
LOGGER.info("表达变量 desc = {}", descValue.toString());
}
LOGGER.info("运行我的 javaDelegate! {},hashCode ={}", this,this.hashCode());
throw new BpmnError("bpmnErrorDemo");
}
问题:
- 在没有抛出BpmnError的情况下流程正常结束,打印的节点执行顺序也正常,但是只要在JavaDelegate中抛出BpmnError错误就会造成流程节点执行顺序错误,但是程序本身并不抛错。
抛出BpmnError控制台打印的流程节点顺序:
16:37:20.842[main][INFO ]运行我的 javaDelegate!
16:37:20.981[main][INFO ]activity = HistoricActivityInstanceEntity[id=13, activityId=usertask1, activityName=User Task]
16:37:20.981[main][INFO ]activity = HistoricActivityInstanceEntity[id=9, activityId=start, activityName=null]
16:37:20.981[main][INFO ]activity = HistoricActivityInstanceEntity[id=10, activityId=someTask, activityName=Service Task]
16:37:20.982[main][INFO ]activity = HistoricActivityInstanceEntity[id=12, activityId=boundaryerror1, activityName=Error]
这里的流程节点执行顺序明显和流程图上所画有出入,但是将抛出BpmnError代码注释后又恢复正常
未抛出BpmnError控制台打印的流程节点顺序:
16:41:37.988[main][INFO ]运行我的 javaDelegate!
16:41:38.058[main][INFO ]activity = HistoricActivityInstanceEntity[id=9, activityId=start, activityName=null]
16:41:38.059[main][INFO ]activity = HistoricActivityInstanceEntity[id=10, activityId=someTask, activityName=Service Task]
16:41:38.059[main][INFO ]activity = HistoricActivityInstanceEntity[id=12, activityId=end, activityName=null]
请问老师:这个是我个人代码的问题?还是抛出BpmnError后确实会对流程执行顺序产生干扰?
谢谢老师!
1回答
-
Jimmy
2020-12-06
抛出BpmnError会改变流程的执行顺序,因为抛出BpmnError后当前顺序会中断,跳出当前流程顺序进入异常捕获边界流程,这一点跟java的异常抛出捕获不完全一样,但是逻辑是近似的
00
相似问题