1.包容网关定义
是指流程中分支流程的判断条件依次执行
2.流程实际情况
在判断条件的设置上需要上一个节点的人员确定,流程表单还不行,必须得用节点表单
3.遇到问题
遇到的问题是节点表单的变量无法被网关读取
4.解决问题
4.1.设置异常断点
然后本地架起debug调试环境,在关键入口点下端点 搜先下个“异常端点”捕获异常报错点
org.flowable.common.engine.api.FlowableException: Unknown property used in expression: ${liuyang>0}
at org.flowable.common.engine.impl.el.JuelExpression.getValue(JuelExpression.java:54)
直观上显示的是表达式的属性未被设置,即没找到这个属性 再继续从堆栈中获取了计算条件的关键判断位置
Expression expression = CommandContextUtil.getProcessEngineConfiguration().getExpressionManager().createExpression(conditionExpression);
Condition condition = new UelExpressionCondition(expression);
return condition.evaluate(sequenceFlow.getId(), execution);
4.2.设置条件断点
继续追踪到,属性计算点 name显示liuyang 图:
AstIdentifier.java:95 Object result = context.getELResolver().getValue(context, null, name); 接下来主要是getValue方法 图:
显示9个属性解析对象
首先是ProcessVariableScopeELResolver解析对象
通过流程表单的调试,发现在这里顺利的拿到了表单属性,但是节点表单为何拿不到呢?
图:
获取原理是,首先找自己的变量作用域,没找到再父的变量作用域 图:
当然流程表单的变量:liuyang在父组件中查找到的
那么节点表单,为何在这里通过继承关系拿不到呢? 思考原因:可能性 1.因为节点表单是流程图的当前网关的上一个节点 2.或许这个节点表单的变量根本没有被设置到当前的变量作用域
未找到原因,我继续追踪流程表单的变量设置原理及获取原理
继续寻找设置
protected Map
protected Map<String, VariableInstanceEntity> variableInstances;
发现了关键入口,我继续设置条件断点:variableName.equals(“liuyang”) 为了复现,我将执行堆栈回退到控制器,再点击Resume Programe(F5)使其重复执行。 结果没有收到中断。那么可能这个变量已经被初始化了,需要我们重新调用接口。
5.最后梳理发现解决问题
protected Map<String, Object> variables;
protected Map<String, Object> variablesLocal;
protected Map<String, Object> transientVariables;
protected Map<String, Object> transientVariablesLocal;
变量分四种类型,局部和全局、临时和持久。两两组合,全局才能将变量传递到网关节点,但是全局的话,当前节点无法获取表单变量 综合上述,在控制器调用的服务方法内进行修改,手动强制设置到任务的全局变量 taskService.setVariables(task.getId(), variables); 图: