最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

flowable全局變量、局部變量、臨時變量

2023-03-19 10:11 作者:Java編程Java  | 我要投稿

1. 為什么需要流程變量

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

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

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

2. 流程變量的分類

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

  • 全局流程變量:在整個流程執(zhí)行期間,這個流程變量都是有效的。

  • 本地流程變量:這個只針對流程中某一個具體的 Task(任務(wù))有效,這個任務(wù)執(zhí)行完畢后,這個流程變量就失效了。

  • 臨時流程變量:顧名思義就是臨時的,這個不會存入到數(shù)據(jù)庫中。

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

3. 全局流程變量

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

3.1 啟動時設(shè)置

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

@Test void test01() {? ? ?

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());?

}

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

我們在流程啟動日志中搜索?休息一下?四個字,可以找到和流程變量相關(guān)的 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, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

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

我們打開?ACT_RU_VARIABLE?表來看一下:

從表中我們可以看到,每一個流程變量都有對應(yīng)的流程實例 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); ??

?}

}

對應(yīng)的查詢 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?表中進(jìn)行查詢,查詢條件中包含了變量的名稱。

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

@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); ?

??}

}

這個對應(yīng)的查詢 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 設(shè)置

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

首先啟動一個流程:

@Test void test01() { ? ?

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

?}

然后設(shè)置流程變量:

@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,然后設(shè)置流程變量,上面這段代碼和小伙伴們演示了兩種設(shè)置方式:

  • 逐個設(shè)置

  • 直接設(shè)置一個 Map

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

3.3 完成任務(wù)時設(shè)置

也可以在完成一個任務(wù)的時候設(shè)置流程變量,如下:

@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 通過流程設(shè)置

由于是全局流程變量,所以我們也可以通過?RuntimeService?來進(jìn)行設(shè)置,如下:

@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 設(shè)置

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

@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);?

}

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

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

此時如果我們完成這個 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()); ?

??}

?}

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

  • 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í)行實例設(shè)置本地變量。

  • org.flowable.engine.RuntimeService#setVariablesLocal:同上,批量設(shè)置。

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

5. 臨時流程變量

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

@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ù)庫中的。

也可以在完成一個任務(wù)的時候設(shè)置臨時變量,如下:

@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ù)庫中的,本次執(zhí)行完后就消失。流程辦理通過或拒絕可以使用臨時變量。

flowable流程設(shè)計框架體驗地址:49.233.19.240

技術(shù)交流微信:zh110906424

技術(shù)交流群


flowable全局變量、局部變量、臨時變量的評論 (共 條)

分享到微博請遵守國家法律
巴林左旗| 岱山县| 方正县| 依安县| 阿瓦提县| 桓仁| 凯里市| 荔波县| 莎车县| 红河县| 福贡县| 吴川市| 米脂县| 晴隆县| 漠河县| 建水县| 宜宾市| 晋宁县| 英德市| 乐陵市| 开原市| 南江县| 长治市| 瑞安市| 滨州市| 稻城县| 元阳县| 繁峙县| 大宁县| 安岳县| 镇平县| 德格县| 垣曲县| 靖边县| 遵义县| 襄城县| 怀来县| 黄陵县| 越西县| 南昌市| 涟源市|