Activiti UEL Method Expressions

Activiti UEL表達式應用入門

葉文華 Todd Yeh 2022/11/15 12:18:26
648

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. 參考資料

Activiti - Expressions

Java EE 6 - Value and Method Expressions

葉文華 Todd Yeh