问题描述:
由于目前项目采用多租户方式和指定 流程编号 方式组合启动流程,但是发现 flowable 未提供对应方式,那么该如何解决呢?
源代码截图
解决方案
仔细查看 runtimeService 发现提供了 构造器启动方式,因此可以采用该方法 启动流程
启动方式可以改成如下:
Authentication.setAuthenticatedUserId(String.valueOf(applyAddReqDTO.getStartUserId()));
/* 以Builder 方式启动流程,解决 无 租户 和 Id 的启动方式 使用租户的前提时,部署时 也需要设置 租户编号! */
ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
.tenantId(applyAddReqDTO.getTenantId())
.processDefinitionId(processInfo.getDefinitionId())
.variables(businessDataMap)
.start();
/* 防止多线程的时候出问题 */
Authentication.setAuthenticatedUserId(null);
查看结果
聪明的你是否以为 使用构造器启动,并设置租户编号即可呢?
注意这里有个BUG,必须部署时 也设置 租户编号 才能发起流程时 也设置租户编号!
以下为手动部署的代码:
Deployment deployment = null;
try {
deployment = repositoryService.createDeployment()
.name(processDTO.getProcessName())
.key(processPublishDTO.getProcessKey())
.tenantId(processPublishDTO.getTenantId())
.addBytes(processPublishDTO.getProcessKey() + ".bpmn20.xml", processPublishDTO.getProcessXml().getBytes("UTF-8"))
.deploy();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return Result.responseError(new EntityError(EntityError.SYSTEM_ERROR.getCode(), e.getMessage()));
}
对比结果