关于java:Flowable实战三流程部署管理

47次阅读

共计 3450 个字符,预计需要花费 9 分钟才能阅读完成。

一、流程定义的版本

  当部署流程定义时,数据库中的流程定义会是这个样子:

id key name version
myProcess:1:676 myProcess My important process 1

  如果咱们当初部署同一个流程的更新版本(例如批改局部用户工作),且放弃流程定义的 id 不变,那么流程定义表中会蕴含上面的记录:

id key name version
myProcess:1:676 myProcess My important process 1
myProcess:2:870 myProcess My important process 2

  当调用执行流程时,会应用版本 2 的流程定义,因为这是这个流程定义的最新版本。

二、流程部署形式

2.1 指定我的项目内资源文件部署

  比方在 resources/ 下新建资源文件 single-task.bpmn20.xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions
        xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
        xmlns:flowable="http://flowable.org/bpmn"
        targetNamespace="Examples">

    <process id="singleTask" name="The One Task Process">
        <startEvent id="theStart" />
        <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
        <userTask id="theTask" name="my task" flowable:assignee="zhangsan" />
        <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
        <endEvent id="theEnd" />
    </process>

</definitions>

  部署示例代码:

 // 资源门路
String path = "single-task.bpmn20.xml";
// 创立部署构建器
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
// 增加资源
deploymentBuilder.addClasspathResource(path);
// 执行部署
deploymentBuilder.deploy();
// 验证部署
long count = repositoryService.createProcessDefinitionQuery().processDefinitionKey("singleTask").count();
// count 等于 1,则阐明部署胜利 

  只有是在我的项目 class 目录下的资源,都能够用这种形式部署。

  这种形式个别用于开发测试阶段,真正的生产环境,是通过与 web 治理页面交互部署。

2.2 springboot 主动部署

  在 springboot 环境下,resources/processes 目录下的任何 BPMN 2.0 流程定义都会被主动部署。

2.3 接口方式

  理论生产中,咱们须要接管前端传回来的流程定义数据,而后更新部署。

  上面咱们省去前端拜访接口参数的展现,仅演示后端解决代码。

// 从前端接管到的 XML 字符串
// 此处省去 xml 具体内容,可参考 2.1 的 single-task.bpmn20.xml 示例
// 留神将 id 定义为 singleTask2,以便跟 2.1 的内容作出区别
String text = "<?xml version=\"1.0\"encoding=\"UTF-8\"?><definitions...</definitions>";
// 创立部署构建器
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
// 执行部署
deploymentBuilder.addString("single-task2.bpmn20.xml", text).deploy();
// 验证部署
long count = repositoryService.createProcessDefinitionQuery().processDefinitionKey("singleTask2").count();
// count 等于 1,则阐明部署胜利 

2.4 zip 压缩包

  当咱们须要一次同时部署多个资源时,能够通过 zip 压缩包的部署形式。

String fileName = "path/multi-task.zip";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(fileName));

repositoryService.createDeployment()
    .name("multi-task.zip")
    .addZipInputStream(inputStream)
    .deploy();

补充:流程定义文件,须要由流程设计器生成。整合流程设计器,可参考:https://blog.csdn.net/JinYJ20…

三、流程治理

  业务零碎的第一步,就是须要一个列表能够浏览和治理流程定义。

3.1 获取已部署流程列表

@Autowired
private RepositoryService repositoryService;

public List getDeployList() {List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
    return list;
}

3.2 读取流程图片

  显然,治理页面须要显示流程图片的性能。

  Flowable 引擎会在流程部署时,主动生成流程图片。

  获取流程图片办法:

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
  .processDefinitionKey("singleTask")
  .singleResult();

String diagramResourceName = processDefinition.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);

留神:如果不须要或不心愿在部署时生成流程图,能够在流程引擎配置中设置 isCreateDiagramOnDeploy 参数:

<property name="createDiagramOnDeploy" value="false" />

3.3 读取流程定义的 XML

  治理界面可减少“显示流程定义代码”性能,即读取显示流程定义的 XML 内容。

// 依据 processDefinitionId 查问
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
// 读取资源流,resourceName 为前端传回的资源名称
InputStream stream = repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName);
// 读取到的资源流再返回到前端 

3.4 删除部署

  一个流程定义不是通过流程定义 ID 删除,而是通过流程定义的部署 ID 删除。在执行删除时,会将和本次部署无关的资源一起删除。

repositoryService.deleteDeployment(deploymentId, true);

四、小结

  本篇介绍了流程定义的版本、部署及治理的应用办法。当然,在理论利用中,还有很多细节须要优化,比方流程定义部署时的去重,分页获取流程列表等等。

正文完
 0