欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flowable?設(shè)置任務(wù)處理人的四種方式詳解

 更新時間:2022年10月11日 16:16:44   作者:江南一點雨  
這篇文章主要為大家介紹了Flowable?設(shè)置任務(wù)處理人的四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

@[toc] 上篇文章松哥和大家分享了 Flowable 中的 ReceiveTask,這只是流程中任務(wù)的一種,今天我們就一起來看另外一個更為常見的 Task--UserTask。

UserTask 看名字就知道,需要人工干預(yù),而人工處理的方式有很多種,我們可以設(shè)置節(jié)點是由哪個用戶處理,也可以設(shè)置是由哪個用戶組來處理(相當(dāng)于是由哪個角色來處理),今天這篇文章我主要和大家分享設(shè)置用戶的三種方式,至于如何設(shè)置用戶組,這個咱們下篇文章再聊。

現(xiàn)在,假設(shè)我有如下一個簡單的流程圖:

那么我該如何設(shè)置這個用戶節(jié)點的處理人呢?

1. 指定具體用戶

第一種方式,是我們在繪制流程圖的時候,可以選中這個節(jié)點,然后直接設(shè)置流程的處理人,像下面這樣:

然后在打開的窗口中選擇固定值,設(shè)置具體分配的用戶是 javaboy,如下圖:

好了,現(xiàn)在這個節(jié)點就固定的由一個名為 javaboy 的用戶去處理了。

對應(yīng)的 XML 文件如下:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:assignee="javaboy" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

在上面這段 XML 中,小伙伴們看到 UserTask 節(jié)點中有一個 flowable:assignee="javaboy",這句話就是設(shè)置這個 UserTask 的處理人。

接下來,我們部署并啟動這個流程(具體的部署啟動方式可以參考本系列之前的文章),啟動之后,我們可以在數(shù)據(jù)庫的 ACT_RU_TASK 表中看到,這個 UserTask 的處理人是 javaboy,如下圖:

現(xiàn)在我們可以通過 Java 代碼去查詢 javaboy 需要處理的 UserTask 了,如下:

@Autowired
TaskService taskService;
@Test
void test11() {
    List<Task> list = taskService.createTaskQuery().taskAssignee("javaboy").list();
    for (Task task : list) {
        logger.info("id:{},name:{}",task.getId(),task.getName());
    }
}

這個查詢,本質(zhì)上其實就是去 ACT_RU_TASK 表中查詢的,我們來看看執(zhí)行的 SQL:

查詢到這個任務(wù)之后,javaboy 有兩種選擇:

  • 將這個任務(wù)指定給另外一個人,例如 zhangsan。
  • 自己處理。

1.1 重新指定任務(wù)處理人

假設(shè) javaboy 查詢到自己的任務(wù)之后,想把這個任務(wù)交給 zhangsan 去處理,方式如下:

@Autowired
TaskService taskService;
@Test
void test11() {
    List<Task> list = taskService.createTaskQuery().taskAssignee("javaboy").list();
    for (Task task : list) {
        taskService.setAssignee(task.getId(),"zhangsan");
    }
}

這行代碼執(zhí)行完成后,我們看數(shù)據(jù)庫中的 ACT_RU_TASK 表,還是剛才那條記錄,但是處理人變了,變成了 zhangsan:

小伙伴們看到,版本號從 1 變?yōu)?2 了,說明這條記錄被更新過了,處理人則從 javaboy 變?yōu)榱?zhangsan。

最后我們再來看下這個操作所執(zhí)行的 SQL,來驗證一下我們前面的結(jié)論:

小伙伴們注意看這里執(zhí)行的 SQL,以及對應(yīng)的參數(shù),說明我們上面的分析是沒有問題的。

1.2 自己處理

如果 javaboy 想自己處理這個任務(wù)也是可以的,方式如下:

@Autowired
TaskService taskService;
@Test
void test11() {
    List<Task> list = taskService.createTaskQuery().taskAssignee("javaboy").list();
    for (Task task : list) {
        taskService.complete(task.getId());
    }
}

處理完成后,ACT_RU_TASK 表中的記錄也會被自動刪除掉(執(zhí)行過的 UserTask 會被自動刪除)。

這種方式是指定了具體的用戶,很顯然這種硬編碼的方式使用起來很不方便,我們需要的是能夠動態(tài)指定任務(wù)處理人的方式。

2. 通過變量設(shè)置

如果想動態(tài)指定 UserTask 的處理人,則可以通過變量來實現(xiàn),具體方式如下:

在繪制流程圖的時候,還是指定流程的具體處理人,但是在指定的時候,使用變量代替,如下圖:

這里的 #{manager} 表示這個 UserTask 由一個名為 manager 的變量來指定,此時的 XML 文件則是下面這樣:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:assignee="#{manager}" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

小伙伴們看到,UserTask 節(jié)點中的 flowable:assignee="#{manager}" 就表示這個 UserTask 的處理人由 manager 變量指定。

對于這樣的流程,我們在上一個節(jié)點處就需要指定下一個節(jié)點的處理人,對于當(dāng)前案例來說,當(dāng)然是要在流程啟動的時候,指定這個 UserTask 的處理人,方式如下:

@Test
void test01() {
    Map<String, Object> variables = new HashMap<>();
    variables.put("manager", "javaboy");
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01",variables);
    logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

當(dāng)流程啟動成功之后,大家去查看 ACT_RU_TASK 表,就可以看到,有一個待處理的 UserTask,處理人是 javaboy,如下圖:

能看到這條記錄,就說明這個 UserTask 的處理人我們已經(jīng)設(shè)置成功了。

接下來具體的處理邏輯,則參考 1.1 和 1.2 小節(jié)。

3. 通過監(jiān)聽器設(shè)置

當(dāng)然,我們也可以通過監(jiān)聽器來設(shè)置任務(wù)的處理人。具體方式如下:

首先我們在繪制流程圖的時候,不需要給 UserTask 分配用戶,如下圖:

然后我們?yōu)檫@個 UserTask 設(shè)置一個任務(wù)監(jiān)聽器,步驟如下:

首先點擊 + 號,然后選擇 CREATE 事件,最后再給出事件對應(yīng)的實體類,如下:

當(dāng)然這個實體類是我們項目中真實存在的一個類,如下:

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        delegateTask.setAssignee("javaboy");
    }
}

當(dāng)這個 UserTask 創(chuàng)建的時候,就會觸發(fā)這個監(jiān)聽器,為該 UserTask 設(shè)置處理人。

我們來看看這個流程圖對應(yīng)的 XML 文件是什么樣子的:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:formFieldValidation="true">
    <extensionElements>
      <flowable:taskListener event="create" class="org.javaboy.flowableidm.MyTaskListener"></flowable:taskListener>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

小伙伴們看到,event="create" class="org.javaboy.flowableidm.MyTaskListener" 就是我們設(shè)置的內(nèi)容了。

現(xiàn)在我們部署并啟動這個流程,當(dāng)我們流程啟動后,就可以在 ACT_RU_TASK 表中看到一條 javaboy 待處理的任務(wù)了。

4. 其他情況

最后再來說說一種特殊情況,就是這個 UserTask 由任務(wù)的發(fā)起人處理,任務(wù)是誰發(fā)起的,誰來處理人這個 UserTask。

這個首先需要在流程啟動事件上設(shè)置任務(wù)的發(fā)起人變量名,如下,流程的啟動節(jié)點,然后設(shè)置任務(wù)的發(fā)起人:

接下來,在給 UserTask 設(shè)置處理人的時候,設(shè)置處理人和任務(wù)的發(fā)起人的變量是同一個,如下圖:

好啦,這就可以了。來看看對應(yīng)的 XML 文件:

<process id="demo01" name="demo01" isExecutable="true">
  <documentation>demo01</documentation>
  <startEvent id="startEvent1" flowable:initiator="INITATOR" flowable:formFieldValidation="true"></startEvent>
  <userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:assignee="#{INITATOR}" flowable:formFieldValidation="true">
    <extensionElements>
      <modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
    </extensionElements>
  </userTask>
  <sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
  <endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
  <sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>

startEvent 中有一個 flowable:initiator="INITATOR" 表示設(shè)置流程發(fā)起人的變量為 INITATOR。后續(xù)在 UserTask 中使用該變量即可。

將這個流程部署成功之后,按照如下方式啟動流程:

@Test
void test01() {
    Authentication.setAuthenticatedUserId("javaboy");
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01");
    logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

Authentication.setAuthenticatedUserId("javaboy"); 表示設(shè)置流程的發(fā)起人為 javaboy。

好啦,今天的文章就和小伙伴們介紹了如何給 UserTask 設(shè)置處理人,后面松哥再和大家分享如何給 UserTask 設(shè)置候選人和候選組,更多關(guān)于Flowable 設(shè)置任務(wù)處理人的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java8?Stream教程之collect()的技巧

    Java8?Stream教程之collect()的技巧

    Java8引入了全新的Stream?API,這里的Stream和I/O流不同,它更像具有Iterable的集合類,但行為和集合類又有所不同,下面這篇文章主要給大家介紹了關(guān)于Java8?Stream教程之collect()的技巧,需要的朋友可以參考下
    2022-09-09
  • Java將日期類型Date時間戳轉(zhuǎn)換為MongoDB的時間類型數(shù)據(jù)

    Java將日期類型Date時間戳轉(zhuǎn)換為MongoDB的時間類型數(shù)據(jù)

    今天小編就為大家分享一篇關(guān)于Java將日期類型Date時間戳轉(zhuǎn)換為MongoDB的時間類型數(shù)據(jù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • java中的取整與四舍五入方法實例

    java中的取整與四舍五入方法實例

    這篇文章主要給大家介紹了關(guān)于java中取整與四舍五入的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 舉例講解Java中do-while語句的使用方法

    舉例講解Java中do-while語句的使用方法

    這篇文章主要介紹了Java中do-while語句的使用方法例子,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • java啟動jar包修改JVM默認內(nèi)存問題

    java啟動jar包修改JVM默認內(nèi)存問題

    這篇文章主要介紹了java啟動jar包修改JVM默認內(nèi)存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java如何獲取JSON中某個對象的值

    Java如何獲取JSON中某個對象的值

    這篇文章主要介紹了Java如何獲取JSON中某個對象的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • MyBatis saveBatch 性能調(diào)優(yōu)的實現(xiàn)

    MyBatis saveBatch 性能調(diào)優(yōu)的實現(xiàn)

    本文主要介紹了MyBatis saveBatch 性能調(diào)優(yōu)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Mybatis中兼容多數(shù)據(jù)源的databaseId(databaseIdProvider)的簡單使用方法

    Mybatis中兼容多數(shù)據(jù)源的databaseId(databaseIdProvider)的簡單使用方法

    本文主要介紹了Mybatis中兼容多數(shù)據(jù)源的databaseId(databaseIdProvider)的簡單使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Java創(chuàng)建數(shù)組的3種方式代碼舉例

    Java創(chuàng)建數(shù)組的3種方式代碼舉例

    數(shù)組是相同類型數(shù)據(jù)的有序集合,數(shù)組描述的是若干個相同類型的數(shù)據(jù)按照一定的先后次序排列組合而成,其中每一個數(shù)據(jù)稱為數(shù)組的元素,可以通過下標(biāo)進行訪問,這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建數(shù)組的3種方式,需要的朋友可以參考下
    2024-01-01
  • IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南

    IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南

    本節(jié)就來教大家如何在IDEA連接MySQL后管理數(shù)據(jù)庫(創(chuàng)建/修改/刪除數(shù)據(jù)庫、創(chuàng)建/修改/刪除表、插入/更新/刪除/查詢表記錄),文中通過圖文結(jié)合的方式給大家講解的非常詳細,需要的朋友可以參考下
    2024-05-05

最新評論