跳到主要内容

部署

Doubao 中英对照 Deployment

业务归档​

要部署流程,必须先将其包装在业务归档(BAR)中。业务归档是部署到 Flowable 引擎的单元。业务归档等价于一个 ZIP 文件。它可以包含 BPMN 2.0 流程、表单定义、DMN 规则以及任何其他类型的文件。一般来说,业务归档包含一组具名资源。

部署业务归档时,会扫描其中扩展名为 .bpmn20.xml 或 .bpmn 的 BPMN 文件。每个文件都会被处理,并且可能包含多个流程定义。
当 DMN 引擎被激活时,.dmn 文件也会被解析;当表单引擎被激活时,.form 文件也会被处理。

注意

业务归档中存在的 Java 类不会被添加到 classpath。业务归档中流程定义所使用的所有自定义类(例如 Java 服务任务或事件监听器实现)都必须能在 Flowable 引擎的 classpath 上获取,才能运行这些流程。

以编程方式部署​

从 ZIP 文件部署业务归档可以这样做:

String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));

repositoryService.createDeployment()
.name("process-one.bar")
.addZipInputStream(inputStream)
.deploy();

也可以从单个资源构建部署。更多细节请参见 javadoc。

外部资源​

流程定义存储在 Flowable 数据库中。这些流程定义在使用服务任务、执行监听器时可以引用委托类(delegation class),或者引用来自 Flowable 配置文件的 Spring Bean。这些类和 Spring 配置文件必须能被所有可能执行该流程定义的流程引擎获取。

Java 类​

在你的流程中使用的所有自定义类(例如服务任务中使用的 JavaDelegate,或事件监听器、TaskListener 等),都必须在启动流程实例时存在于引擎的 classpath 上。

但在部署业务归档时,这些类不必存在于 classpath 上。这意味着,例如在使用 Ant 部署新的业务归档时,你的委托类不必位于 classpath 上。

如果你使用的是演示(demo)环境并希望添加自定义类,应该将包含这些类的 JAR 添加到 flowable-task 或 flowable-rest webapp 的 lib 目录中。别忘了同时包含自定义类的依赖(如果有的话)。或者,你也可以将依赖放入 Tomcat 安装目录的 libraries 目录中,即 ${tomcat.home}/lib。

在流程中使用 Spring Bean​

当表达式或脚本使用 Spring Bean 时,在执行流程定义时这些 Bean 必须对引擎可用。如果你正在构建自己的 webapp,并且按照 Spring 集成章节 所述在自己的上下文中配置流程引擎,那这很简单。但请记住,如果你使用了 Flowable task 和 rest webapp,也应该用该上下文更新它们。

创建单一应用​

与其确保所有流程引擎都在各自的 classpath 上包含全部委托类并使用正确的 Spring 配置,你可以考虑将 Flowable REST webapp 包含在自己的 webapp 中,从而只保留一个 ProcessEngine。

流程定义的版本管理​

BPMN 本身没有版本管理的概念。这其实是好事,因为可执行的 BPMN 流程文件很可能作为开发项目的一部分存放在版本控制系统仓库(如 Subversion、Git 或 Mercurial)中。不过,作为部署的一部分,引擎中会创建流程定义的版本。在部署期间,Flowable 会在 ProcessDefinition 存入 Flowable 数据库之前为其分配一个版本号。

对于业务归档中的每个流程定义,会执行以下步骤来初始化 key、version、name 和 id 属性:

  • XML 文件中的流程定义 id 属性将用作流程定义的 key 属性。
  • XML 文件中的流程定义 name 属性将用作流程定义的 name 属性。如果未指定 name 属性,则使用 id 属性作为 name。
  • 具有某个特定 key 的流程第一次部署时,会分配版本 1。对于后续部署的具有相同 key 的流程定义,版本号将被设置为当前已部署最高版本号加 1。key 属性用于区分不同的流程定义。
  • id 属性被设置为 {processDefinitionKey}:{processDefinitionVersion}:{generated-id},其中 generated-id 是一个唯一数字,用于保证集群环境下流程定义缓存中流程 ID 的唯一性。

以下面的流程为例:

<definitions id="myDefinitions" >
<process id="myProcess" name="My important process" >
...

部署该流程定义时,数据库中的流程定义将如下所示:

idkeynameversion
myProcess:1:676myProcessMy important process1

假设我们现在部署同一流程的更新版本(例如修改了一些用户任务),但流程定义的 id 保持不变。流程定义表现在将包含以下条目:

idkeynameversion
myProcess:1:676myProcessMy important process1
myProcess:2:870myProcessMy important process2

当调用 runtimeService.startProcessInstanceByKey("myProcess") 时,它将使用版本 2 的流程定义,因为这是该流程定义的最新版本。

如果我们创建如下定义的第二个流程并将其部署到 Flowable,表中将增加第三行。

<definitions id="myNewDefinitions" >
<process id="myNewProcess" name="My important process" >
...

表将如下所示:

idkeynameversion
myProcess:1:676myProcessMy important process1
myProcess:2:870myProcessMy important process2
myNewProcess:1:1033myNewProcessMy important process1

请注意新流程的 key 与第一个流程不同。尽管 name 相同(我们本可能也应该改它),Flowable 在区分流程时只考虑 id 属性。因此新流程是以版本 1 部署的。

提供流程图​

可以向部署中添加流程图图像。该图像将存储在 Flowable 仓库中,并可通过 API 访问。该图像也用于在 Flowable 应用中可视化流程。

假设 classpath 上有一个流程 org/flowable/expenseProcess.bpmn20.xml,其流程 key 为 'expense'。流程图图像的命名约定如下(按此特定顺序):

  • 如果部署中存在一个图像资源,其名称为 BPMN 2.0 XML 文件名拼接流程 key 再加上图像后缀,则使用该图像。在我们的示例中,即 org/flowable/expenseProcess.expense.png(或 .jpg/gif)。如果一个 BPMN 2.0 XML 文件中定义了多个图像,这种方式最合理。每个流程图图像的文件名中都会带有流程 key。
  • 如果不存在这样的图像,则在部署中搜索与 BPMN 2.0 XML 文件名相匹配的图像资源。在我们的示例中即 org/flowable/expenseProcess.png。请注意,这意味着同一 BPMN 2.0 文件中定义的每个流程定义都具有相同的流程图图像。如果每个 BPMN 2.0 XML 文件中只有一个流程定义,这显然不是问题。

以编程方式部署时的示例:

repositoryService.createDeployment()
.name("expense-process.bar")
.addClasspathResource("org/flowable/expenseProcess.bpmn20.xml")
.addClasspathResource("org/flowable/expenseProcess.png")
.deploy();

之后可以通过 API 获取该图像资源:

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

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

生成流程图​

如果部署中未提供图像(如上一节所述),只要流程定义包含必要的'diagram interchange'信息,Flowable 引擎就会生成流程图图像。

该资源的获取方式与部署时提供图像的情况完全相同。

deployment.image.generation

如果由于某种原因不需要或不希望在部署期间生成图,可以在流程引擎配置中设置 isCreateDiagramOnDeploy 属性:

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

此时将不会生成任何图。

类别​

部署和流程定义都具有用户自定义的类别。流程定义类别初始化为 BPMN XML 中 targetNamespace 属性的值:<definitions ... targetNamespace="yourCategory" ...

也可以在 API 中这样指定部署类别:

repositoryService
.createDeployment()
.category("yourCategory")
...
.deploy();