Activiti UEL表達式應用入門
1. 說明
Activiti支持在許多節點/元件中,使用表達式UEL,其支援Java EE 6規範中UEL(Unified Expression Language)的兩種表達式Value expressions及Method Expressions,在流程圖上可直接使用Java物件,如:JavaBeans元件。常見像用在UserTask節點(如下圖)中設定Assignee、Candidate(users、groups),使用Value expressions由變數取得成員或角色。
支持使用Value expressions
或是如下圖,線(Flow)中屬性Condition,包含了物件activitiCommonServiceImpl,並使用其method: substring()。此處使用Method Expressions,這簡化了Activiti流程圖設計的複雜度,且收攏運算條件或判斷節點的使用(例:增加ScriptTask撰寫script),也讓重覆的運算程式可以共用。
支持使用Method Expressions
2. 實作
2.1. Java程式
標記ActivitiCommonServiceImpl類別為@Service,並公開substring方法,將可在Method Expressions當中使用。
@Service
public class ActivitiCommonServiceImpl implements IActivitiCommonService {
@Override
public String substring(String variable, int start, int end) {
String result = StringUtils.substring(variable, start, end);
LOGGER.info("variable: {}, substring result: {}", variable, result);
return result;
}
}
2.2. Activiti流程圖
在Element當中使用上述類別物件activitiCommonServiceImpl,並使用其method: substring(),並可嵌入Value expressions取得CUFlag。
取得CUFlag變數其子字串
流程圖上述Condiction expression原始碼:
<sequenceFlow id="flow7" sourceRef="inclusivegateway1" targetRef="CU01_1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${activitiCommonServiceImpl.substring(CUFlag,1,2)=="Y"}]]></conditionExpression>
</sequenceFlow>
3. 測試
設定變數CUFlag=NY,在通過inclusivegateway1(InclusiveGateway)後,經由flow7(SequenceFlow)線上Condition驗證後,完成進入服務任務節點CU01_1(ServiceTask)。
3.1. 流程變數
設定變數CUFlag=NY
3.2. 執行Log
2022-11-14 17:07:58.215 [http-nio-8787-exec-10] [INFO ] [com.tp.bpmutils.activiti.service.impl.ActivitiCommonServiceImpl:247] - variable: NY, substring result: Y
2022-11-14 17:07:58.216 [http-nio-8787-exec-10] [INFO ] [com.tp.bpmutils.activiti.service.impl.ActivitiCommonServiceImpl:247] - variable: NY, substring result: N
3.3. 歷史節點實例
觀察歷史節點路徑InclusiveGateway->SequenceFlow->ServiceTask
4. 後記
使用UEL-Method Expressions雖然讓流程圖與Java程式綁得更死,但若能定義一些實用的工具方法,卻能讓流程圖更加簡潔、易理解,適當的使用必然可以使流程圖規劃更加靈活。
5. 參考資料