activiti分支判斷
有接觸過activiti的小夥伴們,可能會知道activiti可以利用網關來達到分支流轉,但是對於一些業務員來說,跟他們說啥是網關,他們可能會一臉懵逼,尤其activiti的網關有那多個,比如互斥網關、並行網關、兼容網關等等,這個給非研發的小夥伴在畫流程時,帶來的一定難度。在網上查找了一些例子,發現他們實現分支判斷,大部分都依靠網關來實現。然而我發現其實在節點的連接線上,設置一些分支條件流轉規則也可以達到效果。如下圖
其BPMN文件分支內容爲
<sequenceFlow id="flow2" name="<=3" sourceRef="usertask1" targetRef="usertask2"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days<=3}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow3" name=">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); }