工作流引擎之activiti利用juel进行条件分支判断

/ 0条评论 / 0 个点赞 / 1833人阅读

activiti分支判断

有接触过activiti的小伙伴们,可能会知道activiti可以利用网关来达到分支流转,但是对于一些业务员来说,跟他们说啥是网关,他们可能会一脸懵逼,尤其activiti的网关有那多个,比如互斥网关、并行网关、兼容网关等等,这个给非研发的小伙伴在画流程时,带来的一定难度。在网上查找了一些例子,发现他们实现分支判断,大部分都依靠网关来实现。然而我发现其实在节点的连接线上,设置一些分支条件流转规则也可以达到效果。如下图

/upload/article/png/520520_20210706193726.png

其BPMN文件分支内容为

<sequenceFlow id="flow2" name="&lt;=3" sourceRef="usertask1" targetRef="usertask2">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days<=3}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow3" name="&gt;3" sourceRef="usertask1" targetRef="usertask3">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days>3}]]></conditionExpression>
    </sequenceFlow>

而如果有网关时候的流程图如下图

/upload/article/png/520520_20210706193819.png

经过代码测试发现,去除了网关,只用juel表达式也可以实现条件流转

什么是juel

其官网的定义是:JUEL is an implementation of the Unified Expression Language (EL), specified as part of the JSP 2.1 standard (JSR-245), which has been introduced in JEE5. Additionally, JUEL 2.2 implements the JSP 2.2 maintenance release specification for full JEE6 compliance.
其中文大意是:JUEL是统一表达式语言(EL)的一种实现,它被指定为JSP 2.1标准(JSR-245)的一部分,该标准已在JEE5中引入。 此外,JUEL 2.2实现了JSP 2.2维护版本规范,以实现完整的JEE6合规性。 其写法和el表达式一模一样,如${day>3}

如何利用juel表达式实现分支判断

代码实现逻辑

public static Boolean checkFormDataByRuleEl(String el, Map<String, Object> formData) throws Exception {

        ExpressionFactory factory = new ExpressionFactoryImpl();
        SimpleContext context = new SimpleContext();
        for (Object k : formData.keySet()) {
            if (formData.get(k) != null) {
                context.setVariable(k.toString(), factory.createValueExpression(formData.get(k), formData.get(k).getClass()));
            }
        }

        ValueExpression e = factory.createValueExpression(context, el, Boolean.class);
        return (Boolean) e.getValue(context);
    }

    public static void main(String[] args) throws Exception {
        String el = "${请假天数>3 && 部门 == '产品部'}";
        Map<String, Object> formData = new HashMap<>();
        formData.put("请假天数", 4);
        formData.put("部门", "产品部");
        formData.put("test", "123");
        System.out.println(checkFormDataByRuleEl(el, formData));
    }

控制台输出

true

根据juel表达式的true或者false可以很容易在代码实现分支判断

在非activiti项目中如何使用juel表达式判断

引入依赖包

<dependency>
    <groupId>juel</groupId>
    <artifactId>juel</artifactId>
    <version>2.1.0</version></dependency>

代码逻辑实现

public static Boolean checkFormDataByRuleEl(String el, Map<String, Object> formData) throws Exception {

        ExpressionFactory factory = new ExpressionFactoryImpl();
        SimpleContext context = new SimpleContext();
        for (Object k : formData.keySet()) {
            if (formData.get(k) != null) {
                context.setVariable(k.toString(), factory.createValueExpression(formData.get(k), formData.get(k).getClass()));
            }
        }

        ValueExpression e = factory.createValueExpression(context, el, Boolean.class);
        return (Boolean) e.getValue(context);
    }