如何在BPMN的ServiceTask中通过DataObject配置SkipExpression实现任务跳过?
实现方案:通过SkipExpression检查DataObject变量跳过ServiceTask
完全可以在BPMN内部实现这个需求,只需要给REFRESH_TASK的skipExpression配置正确的EL表达式即可,结合你提供的示例,具体实现如下:
核心表达式配置
将serviceTask的skipExpression替换为:
skipExpression="${optionalInputList.contains('input1')}"
逻辑说明
- 你已经正确配置了
_ACTIVITI_SKIP_EXPRESSION_ENABLED为true,这是启用跳过表达式的必要前提,Flowable会识别这个全局变量开启跳过逻辑。 optionalInputList作为DataObject,其配置的JSON数组值会被Flowable自动解析为Java的List<String>对象,因此可以直接调用contains()方法判断目标元素是否存在。- 当表达式返回
true(即input1存在于optionalInputList中)时,REFRESH_TASK会被直接跳过,不会执行绑定的com.delegates.customDelegate代理类。
修改后的完整ServiceTask代码
<serviceTask id="REFRESH_TASK" name="REFRESH_TASK" flowable:async="true" skipExpression="${optionalInputList.contains('input1')}" flowable:triggerable="true" flowable:class="com.delegates.customDelegate"> <extensionElements> <flowable:field name="inputData"> <flowable:string>["input1"]</flowable:string> </flowable:field> <flowable:field name="outputDataConfig"> <flowable:string>["output1"]</flowable:string> </flowable:field> </extensionElements> </serviceTask>
动态场景扩展(可选)
如果后续需要从inputData字段动态获取要检查的元素(而非固定写死input1),可以调整表达式为:
skipExpression="${optionalInputList.contains(inputData.get(0))}"
这里的inputData会被解析为List对象,通过get(0)取出第一个元素进行存在性判断。
内容的提问来源于stack exchange,提问作者Jim Moriarty
相关产品推荐
相关产品推荐

