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 图:

属性计算.png

AstIdentifier.java:95 Object result = context.getELResolver().getValue(context, null, name); 接下来主要是getValue方法 图:

属性解析候选对象.png

显示9个属性解析对象 首先是ProcessVariableScopeELResolver解析对象 通过流程表单的调试,发现在这里顺利的拿到了表单属性,但是节点表单为何拿不到呢? 图: 流程表单取值原理.png

获取原理是,首先找自己的变量作用域,没找到再父的变量作用域 图:

属性作用域查找.png

当然流程表单的变量:liuyang在父组件中查找到的

那么节点表单,为何在这里通过继承关系拿不到呢? 思考原因:可能性 1.因为节点表单是流程图的当前网关的上一个节点 2.或许这个节点表单的变量根本没有被设置到当前的变量作用域

未找到原因,我继续追踪流程表单的变量设置原理及获取原理 继续寻找设置 protected Map variableInstances; 通过点击引用关系:发现该map对象的关键设置入口: variables.put(variableName, variableInstances.get(variableName).getValue()); 图:

属性关键设置点.png

回退堆栈.png

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); 图:

本地变量上下文传递.png

强制设置全局变量.png