不晓得小伙伴们有没有注意过,在 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 来查问,这个就看具体情况了。