不知道小夥伴們有沒有留意過,在 Flowable 流程圖的繪製過程中,我們可以編寫一個名為 dataObject 的元素,這個元素可以指定變量的 id、名稱以及數據類型等各種屬性,並且在流程實例啓動的時候,會自動將 dataObject 元素的信息轉換為流程實例變量,這個東西也蠻好玩的,今天鬆哥就帶領小夥伴們來捋一捋 Flowable 中的 dataObject。
1. 添加 dataObject
首先我們來看下,在流程繪製的過程中,如何去添加 dataObject 對象。
IDEA 上的 Flowable 流程圖繪製插件中還不能添加 dataObject 屬性,這個需要我們去 flowable-ui 中去添加。
我們來隨便繪製一個如下這樣簡單的流程圖:
看過鬆哥之前幾篇文章的小夥伴應該對這張圖很熟悉了,鬆哥這裏也不多説。
我現在就想給這個流程圖,添加 dataObject 屬性,方式如下:
首先打開流程圖,不要選擇任何節點,在下方可以找到數據對象屬性,如下圖:
點擊之後,就可以添加 dataObject 了,如下:
配置完成之後,點擊保存按鈕。然後我們下載這個流程圖,下載之後,打開,我們會發現這次的 XMl 節點比之前的 XML 節點多出來瞭如下一些內容:
<dataObject id="name" name="流程繪製人" itemSubjectRef="xsd:string">
<extensionElements>
<flowable:value>javaboy</flowable:value>
</extensionElements>
</dataObject>
<dataObject id="site" name="流程作者網站" itemSubjectRef="xsd:string">
<extensionElements>
<flowable:value>www.javaboy.org</flowable:value>
</extensionElements>
</dataObject>
<dataObject id="date" name="流程繪製時間" itemSubjectRef="xsd:datetime">
<extensionElements>
<flowable:value>2022-09-23T00:00:00</flowable:value>
</extensionElements>
</dataObject>
2. 查詢 dataObject
接下來,按照之前文章介紹的方式,我們先來部署並啓動這個流程圖。
當流程部署成功之後,我們可以在 ACT_RU_VARIABLE 表中查看到 dataObject 中的數據,如下圖:
可以看到,dataObject 的數據是和執行實例 ID 以及流程實例 ID 相關的。
接下來,我們可以通過如下方式來查詢 ACT_RU_VARIABLE 表中的數據:
@Test
void test08() {
List<Execution> list = runtimeService.createExecutionQuery().list();
for (Execution execution : list) {
DataObject data = runtimeService.getDataObject(execution.getId(), "流程繪製人");
logger.info("key:{},name:{},value:{}",data.getDataObjectDefinitionKey(),data.getName(),data.getValue());
}
}
這裏打印出來的信息就是我們剛剛在定義的時候配置的所有流程信息了。
我們來看看這裏查詢的表:
可以看到,這裏先去 ACT_RU_EXECUTION 表中查詢執行實例 ID,然後再根據拿到的執行實例 ID 去 ACT_RU_VARIABLE 表中查詢 dataObject 信息。
這就是 dataObject 的使用,其實非常 Easy!dataObject 平時主要可以用來定義一些全局的屬性。
3. 租户
説到這裏,就順便再來和小夥伴們聊一聊 Flowable 中的租户。
租户這個其實好理解,舉個栗子:
假設我們現在有 A、B、C、D 四個子系統,四個子系統都要部署同一個名為 leave 的流程,如何區分四個不同子系統的的流程呢?通過租户可以解決這個問題。
Flowable 中的租户其實很好理解,其實就是在流程中,多一個一個 TenantID 加以區分每一個流程屬於哪個租户。
我舉個簡單的例子,假設我現在想要根據不同的子系統來部署流程,那麼我可以按照如下方式來設計接口:
@RestController
public class ProcessDeployController {
@Autowired
RepositoryService repositoryService;
@PostMapping("/deploy")
public RespBean deploy(MultipartFile file,String tenantId) throws IOException {
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment()
.category("javaboy的工作流分類")
.name("javaboy的工作流名稱")
.addInputStream("fff.bpmn", file.getInputStream())
.tenantId(tenantId)
.key("javaboy的工作流key666");
Deployment deployment = deploymentBuilder
.deploy();
return RespBean.ok("部署成功",deployment.getId());
}
}
接下來我們通過 POSTMAN 來發送一個 POST 請求,提交流程圖和租户 ID 這兩個參數,如下圖:
小夥伴們注意,我這裏提交了兩個參數,一個是流程圖本身,還有一個是租户 ID。
當這個流程圖部署成功之後,我們在流程定義表 ACT_RE_PROCDEF 中可以看到剛剛設置的租户 ID:
接下來我們需要啓動流程實例的時候,就不能單純拿着流程部署的 ID 去啓動了,還得拿上流程的租户 ID。如果只拿流程本身的信息去啓動,會拋出如下異常:
正確的啓動方式如下:
@Test
void test09() {
identityService.setAuthenticatedUserId("wangwu");
ProcessInstance pi = runtimeService.startProcessInstanceByKeyAndTenantId("leave","A");
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
在後續的 Task 查詢中,我們也可以根據具體的租户 ID 來查詢,這個就看具體情況了。
好啦,Flowable 中的租户和 DataObject 就和小夥伴們聊這麼多,我們下篇文章,繼續。