最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flowable 設置流程變量的四種方式詳解

 更新時間:2022年11月13日 16:17:25   作者:江南一點雨  
這篇文章主要為大家介紹了Flowable 設置流程變量的四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

在之前的文章中,松哥也有和小伙伴們使用過流程變量,然而沒有和大家系統(tǒng)的梳理過流程變量的具體玩法以及它對應的數(shù)據(jù)表詳情,今天我們就來看看 Flowable 中流程變量的詳細玩法。

1. 為什么需要流程變量

首先我們來看看為什么需要流程變量。

舉一個簡單的例子,假設我們有如下一個流程:

這是一個請假流程,那么誰請假、請幾天、起始時間、請假理由等等,這些都需要說明,不然領導審批的依據(jù)是啥?那么如何傳遞這些數(shù)據(jù),我們就需要流程變量。

2. 流程變量的分類

整體上來說,目前流程變量可以分為三種類型:

  • 全局流程變量:在整個流程執(zhí)行期間,這個流程變量都是有效的。
  • 本地流程變量:這個只針對流程中某一個具體的 Task(任務)有效,這個任務執(zhí)行完畢后,這個流程變量就失效了。
  • 臨時流程變量:顧名思義就是臨時的,這個不會存入到數(shù)據(jù)庫中。

在接下來的內(nèi)容中,我會跟大家挨個介紹這些流程變量的用法。

3. 全局流程變量

假設我們就是上面這個請假流程,我們一起來看下流程變量的設置和獲取。

3.1 啟動時設置

第一種方式,就是我們可以在流程啟動的時候,設置流程變量,如下:

@Test
void test01() {
    Map<String, Object> variables = new HashMap<>();
    variables.put("days", 10);
    variables.put("reason", "休息一下");
    variables.put("startTime", new Date());
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
    logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

我們可以在啟動的時候為流程設置變量,小伙伴們注意到,流程變量的 value 也可以是一個對象(不過這個對象要能夠序列化,即實現(xiàn)了 Serializable 接口),然后在啟動的時候傳入這個變量即可。

我們在流程啟動日志中搜索 休息一下 四個字,可以找到和流程變量相關的 SQL,一共有兩條,如下:

insert into ACT_HI_VARINST (ID_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, NAME_, REV_, VAR_TYPE_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_, CREATE_TIME_, LAST_UPDATED_TIME_) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
INSERT INTO ACT_RU_VARIABLE (ID_, REV_, TYPE_, NAME_, PROC_INST_ID_, EXECUTION_ID_, TASK_ID_, SCOPE_ID_, SUB_SCOPE_ID_, SCOPE_TYPE_, BYTEARRAY_ID_, DOUBLE_, LONG_ , TEXT_, TEXT2_) VALUES ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , ( ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

從標名稱上大概就能看出來,ACT_HI_VARINST 是存儲流程執(zhí)行的歷史信息的,ACT_RU_VARIABLE 則是保存流程運行時候的信息的。

我們打開 ACT_RU_VARIABLE 表來看一下:

從表中我們可以看到,每一個流程變量都有對應的流程實例 ID,這就說明這些流程變量是屬于某一個流程實例的,所以我們可以按照如下方式來查詢流程變量:

@Test
void test01() {
    List<Execution> list = runtimeService.createExecutionQuery().list();
    for (Execution execution : list) {
        Object reason = runtimeService.getVariable(execution.getId(), "reason");
        logger.info("reason:{}", reason);
    }
}

對應的查詢 SQL 如下:

: ==>  Preparing: select * from ACT_RU_VARIABLE WHERE EXECUTION_ID_ = ? AND TASK_ID_ is null AND NAME_ = ?
: ==> Parameters: 6fdd2007-4c3a-11ed-aa7e-acde48001122(String), reason(String)
: <==      Total: 1

可以看到,這個就是去 ACT_RU_VARIABLE 表中進行查詢,查詢條件中包含了變量的名稱。

當然,我們也可以直接查詢某一個流程的所有變量,如下:

@Test
void test02() {
    List<Execution> list = runtimeService.createExecutionQuery().list();
    for (Execution execution : list) {
        Map<String,Object> variables = runtimeService.getVariables(execution.getId());
        logger.info("variables:{}", variables);
    }
}

這個對應的查詢 SQL 如下:

: ==>  Preparing: select * from ACT_RU_VARIABLE WHERE EXECUTION_ID_ = ? AND TASK_ID_ is null
 : ==> Parameters: 6fdd2007-4c3a-11ed-aa7e-acde48001122(String)
 : <==      Total: 3

可以看到,這個跟上面的那個差不多,只不過少了 NAME_ 這個條件。

3.2 通過 Task 設置

我們也可以在流程啟動成功之后,再去設置流程變量,步驟如下:

首先啟動一個流程:

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

然后設置流程變量:

@Test
void test03() {
    Task task = taskService.createTaskQuery().singleResult();
    taskService.setVariable(task.getId(), "days", 10);
    Map<String, Object> variables = new HashMap<>();
    variables.put("reason", "休息一下");
    variables.put("startTime", new Date());
    taskService.setVariables(task.getId(),variables);
}

查詢到某一個 Task,然后設置流程變量,上面這段代碼和小伙伴們演示了兩種設置方式:

  • 逐個設置
  • 直接設置一個 Map

上面這個設置流程變量的方式,本質(zhì)上還是往 ACT_HI_VARINST 和 ACT_RU_VARIABLE 表中插入數(shù)據(jù)。具體的 SQL 也和前面的一樣,我就不貼出來了。

3.3 完成任務時設置

也可以在完成一個任務的時候設置流程變量,如下:

@Test
void test04() {
    Task task = taskService.createTaskQuery().singleResult();
    Map<String, Object> variables = new HashMap<>();
    variables.put("reason", "休息一下");
    variables.put("startTime", new Date());
    variables.put("days", 10);
    taskService.complete(task.getId(),variables);
}

底層涉及到的 SQL 都跟前面一樣,我就不贅述了。

3.4 通過流程設置

由于是全局流程變量,所以我們也可以通過 RuntimeService 來進行設置,如下:

@Test
void test05() {
    Execution execution = runtimeService.createExecutionQuery().singleResult();
    runtimeService.setVariable(execution.getId(), "days", 10);
    Map<String, Object> variables = new HashMap<>();
    variables.put("reason", "休息一下");
    variables.put("startTime", new Date());
    runtimeService.setVariables(execution.getId(), variables);
}

好啦,一共就是這四種方式。

4. 本地流程變量

第三小節(jié)我們說的全局流程變量是和某一個具體的流程綁定的,而本地流程變量則不同,本地流程變量和某一個 Task 綁定。

4.1 通過 Task 設置

假設我們啟動流程之后,通過 Task 來設置一個本地流程變量,方式如下:

@Test
void test03() {
    Task task = taskService.createTaskQuery().singleResult();
    taskService.setVariableLocal(task.getId(), "days", 10);
    Map<String, Object> variables = new HashMap<>();
    variables.put("reason", "休息一下");
    variables.put("startTime", new Date());
    taskService.setVariables(task.getId(),variables);
}

上面這段代碼中,我設置了一個本地變量,兩個全局變量,設置完成后,我們?nèi)?nbsp;ACT_RU_VARIABLE 表中來查看一下具體的效果。

大家看到,由于 days 是本地變量,所以它的 TASK_ID_ 有值,這個好理解,說明 days 這個變量和這個具體的 Task 是有關的。

此時如果我們完成這個 Task,代碼如下:

@Test
void test06() {
    Task task = taskService.createTaskQuery().singleResult();
    taskService.complete(task.getId());
}

完成之后,再來查看 ACT_RU_VARIABLE 表,如下:

我們發(fā)現(xiàn)本地變量 days 已經(jīng)沒有了。因為上一個 Task 都已經(jīng)執(zhí)行完畢了,這個時候如果還是按照第三小節(jié)介紹的方式去查詢變量,就查不到 days 了。此時如果需要查詢到曾經(jīng)的 days 變量,得去歷史表中查詢了,方式如下:

@Test
void test07() {
    ProcessInstance pi = runtimeService.createProcessInstanceQuery().singleResult();
    List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(pi.getId()).list();
    for (HistoricVariableInstance hvi : list) {
        logger.info("name:{},type:{},value:{}", hvi.getVariableName(), hvi.getVariableTypeName(), hvi.getValue());
    }
}

這是流程本地變量的特點,當然相關的方法還有好幾個,這里列出來給小伙伴們參考:

  • org.flowable.engine.TaskService#complete(java.lang.String, java.util.Map<java.lang.String,java.lang.Object>, boolean):在完成一個 Task 的時候,如果傳遞了變量,則可以通過第三個參數(shù)來控制這個變量是全局的還是本地的,true 表示這個變量是本地的。
  • org.flowable.engine.RuntimeService#setVariableLocal:為某一個執(zhí)行實例設置本地變量。
  • org.flowable.engine.RuntimeService#setVariablesLocal:同上,批量設置。

好啦,這就是本地流程變量。

5. 臨時流程變量

臨時流程變量是不存數(shù)據(jù)庫的,一般來說我們可以在啟動流程或者完成任務的時候使用,用法如下:

@Test
void test21() {
    Map<String, Object> variables = new HashMap<>();
    variables.put("reason", "休息一下");
    variables.put("startTime", new Date());
    ProcessInstance pi = runtimeService
            .createProcessInstanceBuilder()
            .transientVariable("days", 10)
            .transientVariables(variables)
            .processDefinitionKey("demo01")
            .start();
    logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

上面這段代碼涉及到的流程變量就是臨時流程變量,它是不會存入到數(shù)據(jù)庫中的。

也可以在完成一個任務的時候設置臨時變量,如下:

@Test
void test22() {
    Task task = taskService.createTaskQuery().singleResult();
    Map<String, Object> transientVariables = new HashMap<>();
    transientVariables.put("days", 10);
    taskService.complete(task.getId(), null, transientVariables);
}

這個臨時變量也是不會存入到數(shù)據(jù)庫中的。

以上就是Flowable 設置流程變量的四種方式詳解的詳細內(nèi)容,更多關于Flowable 設置流程變量的資料請關注腳本之家其它相關文章!

相關文章

  • java使用異或?qū)崿F(xiàn)變量互換和異或加密解密示例

    java使用異或?qū)崿F(xiàn)變量互換和異或加密解密示例

    這篇文章主要介紹了使用異或?qū)崿F(xiàn)變量互換和異或加密解密示例,需要的朋友可以參考下
    2014-02-02
  • Windows同時配置兩個jdk環(huán)境變量的操作步驟

    Windows同時配置兩個jdk環(huán)境變量的操作步驟

    Java Development Kit (JDK) 是開發(fā)Java應用程序的基礎,包含了編譯器、調(diào)試器以及其他必要的工具,本指南將一步步指導您完成在Windows操作系統(tǒng)上同時配置兩個jdk環(huán)境變量的操作步驟,需要的朋友可以參考下
    2024-09-09
  • SpringCloud中的Consul詳解

    SpringCloud中的Consul詳解

    這篇文章主要介紹了SpringCloud中的Consul知識,本文使用的是docker-compose方式管理consul服務,直接啟動即可,需要的朋友可以參考下
    2022-03-03
  • Java實現(xiàn)Timer的定時調(diào)度函數(shù)schedule的四種用法

    Java實現(xiàn)Timer的定時調(diào)度函數(shù)schedule的四種用法

    本文主要介紹了Java實現(xiàn)Timer的定時調(diào)度函數(shù)schedule的四種用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • java實現(xiàn)五子棋程序

    java實現(xiàn)五子棋程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)五子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java面試題沖刺第十六天--消息隊列

    Java面試題沖刺第十六天--消息隊列

    這篇文章主要為大家分享了最有價值的三道關于消息隊列的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java實現(xiàn)簡單QQ聊天工具

    Java實現(xiàn)簡單QQ聊天工具

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單QQ聊天工具,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 使用Files.walkFileTree遍歷目錄文件

    使用Files.walkFileTree遍歷目錄文件

    這篇文章主要介紹了使用Files.walkFileTree遍歷目錄文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringBoot幾種常用的接口日期格式化方法

    SpringBoot幾種常用的接口日期格式化方法

    在 Springboot 應用程序中,日期時間格式化處理是非常重要的一方面,本文將總結(jié)SpringBoot幾種常用的接口日期格式化方法,通過示例代碼介紹了非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2024-11-11
  • 淺談spring的重試機制無效@Retryable@EnableRetry

    淺談spring的重試機制無效@Retryable@EnableRetry

    這篇文章主要介紹了淺談spring的重試機制無效@Retryable@EnableRetry,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

永城市| 西安市| 桐庐县| 丹凤县| 富宁县| 陕西省| 龙海市| 岳普湖县| 靖州| 常德市| 泌阳县| 库车县| 青浦区| 龙井市| 新丰县| 奎屯市| 高陵县| 青州市| 西乌珠穆沁旗| 南宁市| 兰坪| 贞丰县| 上思县| 宕昌县| 米易县| 玉山县| 孝义市| 石楼县| 泰和县| 东明县| 上思县| 贡山| 陆良县| 化德县| 古丈县| 安溪县| 青阳县| 临清市| 株洲县| 如皋市| 兴宁市|