工作流引擎之activiti利用juel進行條件分支判斷

activiti分支判斷

有接觸過activiti的小夥伴們,可能會知道activiti可以利用網關來達到分支流轉,但是對於一些業務員來說,跟他們說啥是網關,他們可能會一臉懵逼,尤其activiti的網關有那多個,比如互斥網關、並行網關、兼容網關等等,這個給非研發的小夥伴在畫流程時,帶來的一定難度。在網上查找了一些例子,發現他們實現分支判斷,大部分都依靠網關來實現。然而我發現其實在節點的連接線上,設置一些分支條件流轉規則也可以達到效果。如下圖

其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>

而如果有網關時候的流程圖如下圖

經過代碼測試發現,去除了網關,只用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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章