如何使用流程 中的 DataObject 并为流程设置租户

不知道小伙伴们有没有留意过,在 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 来查询,这个就看具体情况了。

143 声望
36 粉丝
0 条评论
推荐阅读
RocketMQ源码-broker 消息接收流程(写入commitLog)
消息接收:消息接收是指接收producer的消息,处理类是SendMessageProcessor,将消息写入到commigLog文件后,接收流程处理完毕;

Java架构师

Spring事务传播行为详解
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可...

JerryTse242阅读 122.8k评论 97

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.1k评论 16

Java12的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft63阅读 11.9k

Java8的新特性
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java...

codecraft32阅读 24.6k评论 1

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.6k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

143 声望
36 粉丝
宣传栏