activiti工作流引擎之uel表達式


qq討論群:313032825
本人做了一個微信公眾號,用於分享各類視頻學習資源和我多年學習經驗,喜歡的可以關注哦!
公眾號圖片

有了前面幾章,我們肯定有一定的困惑,activiti如何與實際業務整合,比如一條采購單,如何跟一個流程實例互相關聯起來?

這里就需要使用到activiti啟動流程實例時設置一個流程實例的businessKey(一般存儲我們一條采購單的id)

1,啟動流程實例設置其businessKey

復制代碼
/**
     * 啟動一個流程實例,設置其業務id
     */
    @Test
    public void startProInsWithKey() {
        RuntimeService runtimeService = engine.getRuntimeService();
    String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設置一個businessKey,在我實際業務中可能是一個采購單,或者訂單之類的id</span>
    String businessKey ="111"<span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 根據流程定義的key啟動一個流程實例</span>
    ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,businessKey);
    System.out.println(</span>"流程實例id:" +<span style="color: #000000;"> processInstance.getId());
    System.out.println(</span>"流程定義id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId());

}</span></pre>
復制代碼

 一般情況下,我們是在用戶保存一條采購單的時候,啟動這個實例,並且動態獲取采購單的id(也就是用作流程實例的businessKey),並且我們還會在采購單表中保存這個流程實例的id,雙向一對一綁定,方便業務查詢

2,根據采購單的id(也就是用作流程實例的businessKey),動態的查詢出對應的流程實例

復制代碼
/**
     * 通過businessKey查詢流程實例
     */
    @Test
    public void queryProInsWithKey(){
        RuntimeService runtimeService = engine.getRuntimeService();
        String businessKey ="111";
    ProcessInstanceQuery instanceQuery </span>=<span style="color: #000000;"> runtimeService.createProcessInstanceQuery();
    </span><span style="color: #008000;">//</span><span style="color: #008000;">根據其流程定義key和業務id businessKey查詢出對應的流程實例,一般只有一條</span>

instanceQuery.processInstanceBusinessKey(businessKey);
//查詢出唯一的一條流程實例
ProcessInstance processInstance = instanceQuery.singleResult();

    System.out.println(</span>"流程實例id:"+<span style="color: #000000;">processInstance.getId());
    System.out.println(</span>"流程定義id:"+<span style="color: #000000;">processInstance.getProcessDefinitionId());
    
}</span></pre>
復制代碼

到這里,我們就清楚了一個流程實例和實際業務數據的綁定

 

大家到這里也啟動了很多的流程實例了,發現我們的任務辦理人都是寫死為zhangsan,lisi之類的,那么我們可以動態的指定嗎,這就需要使用到我們的uel表達式了

首先uel表達式到底是什么呢?

UEL是java EE6規范的一部分,UEL(Unified Expression Language)即統一表達式語言,activiti支持兩個UEL表達式:UEL-valueUEL-method。我們都會分別做介紹

(一)我們先來演示uel-value

首先做個簡單的使用帶大家入門

使用步驟:(看不明白的運行下面的代碼走一遍再回頭看)

1,在任務的節點,不直接指定處理人的id,設置處理人表達式${assignee},並且重新部署流程定義

2, 啟動一個流程實例是設置啟動變量動態設置assignee的值

3,查看並驗證下一個任務的處理人是否為我們動態設置

 

1,首先我們設置節點

2,在啟動代碼時動態設置assignee的值

復制代碼
/**
     * 啟動流程實例時設置全局變量
     */
    @Test
    public void startProInsWithArgs(){
    RuntimeService runtimeService </span>=<span style="color: #000000;"> engine.getRuntimeService();

    String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設置其啟動的全局變量參數,其value可以是javabean,也可以是普通字符串,數字</span>
    Map&lt;String,Object&gt; variables = <span style="color: #0000ff;">new</span> HashMap&lt;String, Object&gt;<span style="color: #000000;">();
    variables.put(</span>"assignee", "feige"<span style="color: #000000;">);
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設置流程啟動時,設置參數啟動</span>
    ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
    System.out.println(</span>"流程實例id:" +<span style="color: #000000;"> processInstance.getId());
    System.out.println(</span>"流程定義id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId());
    
}</span></pre>
復制代碼

3,這個時候我們通過查看數據庫,查看act_ru_task當前運行的任務,查看

從上面的我們可以看到流程走到了,創建采購單,並且采購的assignee處理人為feige

因為當我們走到了創建采購單時,會從當前流程實例的全局變量查找name為assignee的值,如果查詢到,則將這個assignee的值賦給這個節點,如果我們動態設置了,但是走到這個節點前(為什么說節點前呢,因為還可以在別的時候設置變量,后面的章節會講)

沒有找到這個assignee變量的值,會報錯的,大家可以自己試一試

 


 

當然除了上面的設置方法,我們還有其他的設置方法來動態設置其節點的值嗎?答案是肯定的,啟動的流程時候的參數的value,不僅僅可以是String類型,還可以是Object對象(序列化的),Map,List,Array

我們這里采用對象做演示,執行步驟如下

1,設置流程的第一個節點動態的值為${user.userId},他會默認查找變量name為user的對應的值的getUserId獲取值,重新部署流程定義

2,啟動流程時,設置這個user的javabean到流程的全局變量中

3,查看走到這個節點的當前任務的處理人是否是我們user的userId變量的值

 

1,設置節點

 

2,設置javabean  User對象並且在流程實例啟動時設置進去

復制代碼
public class User implements Serializable{
    /**
     * 用於序列化
     */
    private static final long serialVersionUID = 7717000074223077256L;
    private String userId;
    private String sex;
    private String name;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> User(String userId, String sex, String name) {
    </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
    </span><span style="color: #0000ff;">this</span>.userId =<span style="color: #000000;"> userId;
    </span><span style="color: #0000ff;">this</span>.sex =<span style="color: #000000;"> sex;
    </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getUserId() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> userId;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setUserId(String userId) {
    </span><span style="color: #0000ff;">this</span>.userId =<span style="color: #000000;"> userId;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getSex() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sex;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setSex(String sex) {
    </span><span style="color: #0000ff;">this</span>.sex =<span style="color: #000000;"> sex;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName() {
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name) {
    </span><span style="color: #0000ff;">this</span>.name =<span style="color: #000000;"> name;
}

}

復制代碼
復制代碼
/**
     * 啟動流程設置一個user用戶到全局變量中
     */
    @Test
    public void startProInsWithObj(){
    RuntimeService runtimeService </span>=<span style="color: #000000;"> engine.getRuntimeService();

    String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設置其啟動的全局變量參數,其value設置為user對象,這里寫死</span>
    User user = <span style="color: #0000ff;">new</span> User("101","男","張三"<span style="color: #000000;">);
    
    Map</span>&lt;String,Object&gt; variables = <span style="color: #0000ff;">new</span> HashMap&lt;String, Object&gt;<span style="color: #000000;">();
    variables.put(</span>"user"<span style="color: #000000;">, user);
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設置流程啟動時,設置參數啟動</span>
    ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
    System.out.println(</span>"流程實例id:" +<span style="color: #000000;"> processInstance.getId());
    System.out.println(</span>"流程定義id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId());
    
}</span></pre>
復制代碼

3,到這里流程實例啟動成功,我們觀察數據庫的當前任務表,觀察第一個節點的處理人是否為我們設置的101的userId

 

 設置成功!

 

(二)演示uel-method

執行步驟

1,設置節點的執行人為${method.getUserNameByUserId(userId)} ,其中method方法是我們注入到spring中的一個類,userId是我們設置的全局變量

2,將method方法注入到activiti的processEngineConfiguration的bean中(在我們的activiti.cfg.xml中)

3,啟動一個流程設置全局變量userId作為啟動參數,看看是否走到這個節點的處理人是我們method方法getUserNameByUserId返回的name

 

好了,直接上代碼

1,設置節點,重新部署流程定義

 

2,method的java方法和activiti.cfg.xml的注入配置

復制代碼
public class CommonMethod{
</span><span style="color: #0000ff;">public</span> String getUserNameByUserId(<span style="color: #0000ff;">int</span><span style="color: #000000;"> userId){
    
    </span><span style="color: #0000ff;">return</span> "activiti"+<span style="color: #000000;">userId;
    
}

}

復制代碼
復制代碼
<bean class="cn.nfcm.po.CommonMethod" id="commonmethod"></bean>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="processEngineConfiguration"</span><span style="color: #ff0000;">
    class</span><span style="color: #0000ff;">="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 數據源 </span><span style="color: #008000;">--&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="dataSource"</span> <span style="color: #0000ff;">/&gt;</span>
    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> activiti數據庫表處理策略 </span><span style="color: #008000;">--&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="databaseSchemaUpdate"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="true"</span> <span style="color: #0000ff;">/&gt;</span>
    <span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> 可以注入多個類到activiti的beans中,其中key對應的就是我們的類名 </span><span style="color: #008000;">--&gt;</span>
    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="beans"</span><span style="color: #0000ff;">&gt;</span>
        <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">map</span><span style="color: #0000ff;">&gt;</span>
            <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry </span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">="commonmethod"</span><span style="color: #ff0000;"> value-ref</span><span style="color: #0000ff;">="commonmethod"</span> <span style="color: #0000ff;">/&gt;</span>
        <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">map</span><span style="color: #0000ff;">&gt;</span>
    <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span></pre>
復制代碼

3,啟動一個流程實例

復制代碼
/**
     * 根據方法得到值
     */
    @Test
    public void startProInsWithMethod(){
    RuntimeService runtimeService </span>=<span style="color: #000000;"> engine.getRuntimeService();

    String processDefinitionKey </span>= "purchasingflow"<span style="color: #000000;">;
    </span><span style="color: #008000;">//</span><span style="color: #008000;">這里設置userId為8,走到第一個節點會查找我們注入進去的commonmethod的getUserNameByUserId方法並傳遞userId</span>
    Map&lt;String,Object&gt; variables = <span style="color: #0000ff;">new</span> HashMap&lt;String, Object&gt;<span style="color: #000000;">();
    variables.put(</span>"userId", 8<span style="color: #000000;">);
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">設置流程啟動時,設置參數啟動</span>
    ProcessInstance processInstance =<span style="color: #000000;"> runtimeService.startProcessInstanceByKey(processDefinitionKey,variables);
    System.out.println(</span>"流程實例id:" +<span style="color: #000000;"> processInstance.getId());
    System.out.println(</span>"流程定義id:" +<span style="color: #000000;"> processInstance.getProcessDefinitionId());
    
    
}</span></pre>
復制代碼

到這里我們會發現流程啟動成功,並且流程的當前任務處理人為acitiviti8,在實際的應用中因為都是spring管理的類,我們可以進行多種多樣的查詢賦值,非常方便!

 

原文地址:https://www.cnblogs.com/nfcm/p/6408481.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM