不知道小伙伴们有没有注意到。在绘制Flowable流程图的过程中,我们可以写一个名为dataObject的元素,它可以指定变量的id、名称和数据类型等属性,当流程实例启动时,会自动转换的信息将dataObject元素放入流程实例变量中。Flowable中的数据对象。1、添加dataObject首先,我们看一下在绘制过程中如何添加dataObject对象。IDEA上的Flowable流程图绘制插件无法添加dataObject属性,需要我们在flowable-ui中添加。下面画一个简单的流程图:我现在想给这个流程图添加dataObject属性,方法如下:首先打开流程图,不要选中任何节点,在最下面可以找到data对象属性,如图如下图:点击之后,可以添加dataObject,如下:配置完成后,点击保存按钮。然后我们下载这个流程图。下载打开后,我们会发现这次的XML节点比之前的XML节点多了一些内容::value>javaboywww.javaboy.org2022-09-23T00:00:002.查询dataObject接下来,按照上一篇文章介绍的方法,我们先部署启动这个流程图。流程部署成功后,我们可以在ACT_RU_VARIABLE表中查看dataObject中的数据,如下图所示:可以看到,dataObject的数据与执行实例ID和流程实例ID相关。接下来,我们可以查询ACT_RU_VARIABLE表中的数据,如下:@Testvoidtest08(){Listlist=runtimeService.createExecutionQuery().list();for(Executionexecution:list){DataObjectdata=runtimeService.getDataObject(execution.getId(),"Processdrawer");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,用来区分每个进程属于哪个租户。我举一个简单的例子,假设我要根据不同的子系统来部署进程,那么我可以这样设计接口:@RestControllerpublicclassProcessDeployController@PostMapping("/deploy")publicRespBeandeploy(MultipartFilefile,StringtenantId)throwsIOException{DeploymentBuilderdeploymentBuilder=repositoryService.createDeployment().category("javaboy工作流分类").name("javaboy工作流名称").addInputStream("fff.bpmn",file.getInputStream()).tenantId(tenantId).key("javaboyworkflowkey666");部署deployment=deploymentBuilder.deploy();returnRespBean.ok("部署成功",deployment.getId());}}接下来,我们通过POSTMAN发送POST请求,提交流程图和租户ID这两个参数,如下图:注意,朋友们,我这里提交了两个参数,一个是流程图本身,另一个是租户ID。流程图部署成功后,我们可以在流程定义表ACT_RE_PROCDEF中看到我们刚刚设置的租户ID:接下来,当我们需要启动流程实例时,不能只用流程部署的ID来启动,我们要取上面过程的租户ID。如果只使用进程本身的信息启动,会抛出如下异常:正确的启动方式如下:@Testvoidtest09(){identityService.setAuthenticatedUserId("wangwu");ProcessInstancepi=runtimeService.startProcessInstanceByKeyAndTenantId("离开","A");logger.info("id:{},activityId:{}",pi.getId(),pi.getActivityId());}在后续的Task查询中,我们也可以根据具体的租户ID进行查询,这取决于具体情况。