flowable 条件判断源码
时间: 2023-09-14 12:11:55 浏览: 290
flowablek框架示例代码
Flowable 是一个流程引擎框架,条件判断是其中非常重要的一部分。Flowable 中的条件判断主要分为两类:表达式条件判断和脚本条件判断。下面分别介绍这两种条件判断的源码实现。
1. 表达式条件判断
表达式条件判断是通过表达式来判断条件是否成立。Flowable 中支持的表达式语言有 EL 表达式、Juel 表达式、Mvel 表达式等。这里以 EL 表达式为例。
首先我们看到 Flowable 中的表达式条件判断是通过 org.flowable.bpmn.model.SequenceFlow 类中的 conditionExpression 属性来实现的。该属性的类型为 String,表示一个表达式字符串。
在执行条件判断时,Flowable 会将这个表达式字符串解析成一个 EL 表达式对象,并将当前执行上下文中的变量传递给该表达式对象进行计算,最终得出判断结果。下面是相关源码实现:
```java
public class SequenceFlow extends FlowElement {
protected String conditionExpression;
// ...
public boolean hasCondition() {
return StringUtils.isNotEmpty(conditionExpression);
}
public Expression getConditionExpression() {
if (hasCondition()) {
ExpressionManager expressionManager = Context.getProcessEngineConfiguration().getExpressionManager();
return expressionManager.createExpression(conditionExpression);
}
return null;
}
// ...
}
```
可以看到,当 conditionExpression 属性不为空时,调用 getConditionExpression 方法会将该属性解析成一个 EL 表达式对象返回。
接下来看一下条件判断的执行过程。在 Flowable 中,条件判断是通过 org.flowable.engine.impl.bpmn.behavior.ConditionalEventBehavior 类的 execute 方法实现的。该方法中会先获取 SequenceFlow 对象的 conditionExpression 属性,然后调用 getConditionExpression 方法解析成一个 EL 表达式对象。最后将当前执行上下文中的变量传递给该表达式对象进行计算,得出判断结果。下面是相关源码实现:
```java
public class ConditionalEventBehavior extends FlowNodeActivityBehavior {
// ...
@Override
public void execute(ActivityExecution execution) throws Exception {
// ...
SequenceFlow outgoingSequenceFlow = (SequenceFlow) conditionalEvent.getOutgoingFlows().get(0);
if (outgoingSequenceFlow.hasCondition()) {
Expression conditionExpression = outgoingSequenceFlow.getConditionExpression();
Object value = conditionExpression.getValue(execution);
if (value instanceof Boolean && (Boolean) value) {
leave(execution);
}
} else {
leave(execution);
}
// ...
}
// ...
}
```
可以看到,当 SequenceFlow 对象的 conditionExpression 属性不为空时,会调用 getConditionExpression 方法获取一个 EL 表达式对象,并将当前执行上下文中的变量传递给该表达式对象进行计算。最终得出的判断结果为 true 时,会继续执行下一步任务,否则不会执行。
2. 脚本条件判断
脚本条件判断是通过脚本来判断条件是否成立。Flowable 中支持的脚本语言有 Groovy、JavaScript、Python 等。这里以 Groovy 为例。
在 Flowable 中,脚本条件判断是通过 org.flowable.bpmn.model.ScriptTask 类中的 script 属性来实现的。该属性的类型为 String,表示一个 Groovy 脚本字符串。
执行脚本条件判断的过程与表达式条件判断类似,在这里不再赘述。需要注意的是,在使用脚本条件判断时,需要在流程引擎配置中添加对应的脚本引擎。下面是相关源码实现:
```java
public class ScriptTask extends TaskWithFieldExtensions {
protected String scriptFormat;
protected String script;
// ...
public boolean hasScript() {
return StringUtils.isNotEmpty(script);
}
public Object executeScript(VariableScope variableScope) {
ScriptingEngines scriptingEngines = Context.getProcessEngineConfiguration().getScriptingEngines();
ScriptEngine scriptEngine = scriptingEngines.getScriptEngine(scriptFormat);
return scriptingEngines.evaluate(script, scriptEngine, variableScope);
}
// ...
}
```
可以看到,当 script 属性不为空时,调用 executeScript 方法会将该属性解析成一个 Groovy 脚本对象,并将当前执行上下文中的变量传递给该脚本对象进行计算,最终得出判断结果。
阅读全文