芋道包容网关条件研究

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)
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)
  • 1.
  • 2.
  • 3.
  • 4.

直观上显示的是表达式的属性未被设置,即没找到这个属性
再继续从堆栈中获取了计算条件的关键判断位置

Expression expression = CommandContextUtil.getProcessEngineConfiguration().getExpressionManager().createExpression(conditionExpression);
            Condition condition = new UelExpressionCondition(expression);
            return condition.evaluate(sequenceFlow.getId(), execution);
            Expression expression = CommandContextUtil.getProcessEngineConfiguration().getExpressionManager().createExpression(conditionExpression);
            Condition condition = new UelExpressionCondition(expression);
            return condition.evaluate(sequenceFlow.getId(), execution);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
4.2.设置条件断点

继续追踪到,属性计算点 name显示liuyang
图:

芋道包容网关条件研究_java

属性计算.png

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

芋道包容网关条件研究_java_02

属性解析候选对象.png显示9个属性解析对象

首先是ProcessVariableScopeELResolver解析对象

通过流程表单的调试,发现在这里顺利的拿到了表单属性,但是节点表单为何拿不到呢?

图:

芋道包容网关条件研究_docker_03

流程表单取值原理.png

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

芋道包容网关条件研究_java_04

属性作用域查找.png

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

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

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

芋道包容网关条件研究_docker_05

属性关键设置点.png

芋道包容网关条件研究_表单_06

回退堆栈.png

protected Map<String, VariableInstanceEntity> variableInstances;
protected Map<String, VariableInstanceEntity> variableInstances;
  • 1.
  • 2.

发现了关键入口,我继续设置条件断点: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;
protected Map<String, Object> variables;
protected Map<String, Object> variablesLocal;
protected Map<String, Object> transientVariables;
protected Map<String, Object> transientVariablesLocal;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

变量分四种类型,局部和全局、临时和持久。两两组合,全局才能将变量传递到网关节点,但是全局的话,当前节点无法获取表单变量
综合上述,在控制器调用的服务方法内进行修改,手动强制设置到任务的全局变量
taskService.setVariables(task.getId(), variables);
图:

芋道包容网关条件研究_docker_07

本地变量上下文传递.png

芋道包容网关条件研究_docker_08

强制设置全局变量.png

推荐阅读
配置 docker0 网桥:https://www.skillup.host/1/docker/docker_practice/advanced_network/docker0.md
容器访问控制:https://www.skillup.host/1/docker/docker_practice/advanced_network/access_control.md