Flowable入门系列文章18 - 部署Flowable

Posted 分享牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flowable入门系列文章18 - 部署Flowable相关的知识,希望对你有一定的参考价值。

1、商业档案

要部署Flowable,必须将其打包到业务档案(BAR)中。业务档案是部署到Flowable引擎的单元。业务档案相当于一个ZIP文件。它可以包含BPMN 2.0进程,表单定义,DMN规则和任何其他类型的文件。通常,业务档案包含一组命名资源。

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

存在于业务归档中的Java类将不会被添加到类路径中。业务归档中的流程定义中使用的所有定制类(例如,Java服务任务或事件侦听器实现)必须在Flowable引擎类路径上可用,才能运行这些流程。
1.1、以编程方式进行部署

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

String barFileName = "path/to/process-one.bar";
ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));
repositoryService.createDeployment()
.name("process-one.bar")
.addZipInputStream(inputStream)
.deploy();

也可以从单个资源构建部署。有关更多详细信息,请参阅javadocs。

2、外部资源

流程定义存在于Flowable数据库中。这些流程定义可以在Flowable配置文件中使用服务任务或执行监听器或Spring bean时引用委托类。这些类和Spring配置文件必须对所有可能执行流程定义的流程引擎都可用。

2.1、Java类

在进程实例启动时,在进程中使用的所有自定义类(例如,在服务任务或事件侦听器中使用的JavaDelegates,TaskListeners等等)应该出现在引擎的类路径中。

但是,在部署业务档案的过程中,这些类不必位于类路径中。这意味着,例如,在使用Ant部署新业务归档文件时,您的委托类不必位于类路径中。

当您使用演示设置并且想要添加自定义类时,您应该将包含您的类的JAR添加到可流动任务或可流动休息Web应用程序库中。不要忘记包含自定义类的依赖关系(如果有的话)。或者,您可以将您的依赖关系包含在Tomcat安装的库目录中${tomcat.home}/lib。

2.2、从一个进程使用Spring bean

当表达式或脚本使用Spring bean时,在执行流程定义时,这些bean必须可供引擎使用。如果您正在构建自己的Web应用程序,并且按照Spring集成部分中的描述在您的上下文中配置了流程引擎,那很简单。但是要记住,如果你使用它,你也应该更新Flowable任务并且用这个上下文来休息webapps。

2.3、创建一个应用程序

与其确保所有流程引擎在其classpath中包含所有委托类并使用正确的Spring配置,都可以考虑在自己的Web应用程序中包含Flowable REST Web应用程序,以便只有一个ProcessEngine。

3、流程定义的版本

BPMN没有版本控制的概念。这实际上是好的,因为可执行的BPMN流程文件可能作为开发项目的一部分存在于版本控制系统存储库(如Subversion,Git或Mercurial)中。但是,流程定义的版本是作为部署的一部分在引擎中创建的。在部署期间,Flowable将在将ProcessDefinition其存储在Flowable DB中之前为其分配一个版本。

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

  • 流程定义id的XML文件中的属性作为流程定义key属性。
  • 流程定义name的XML文件中的属性作为流程定义name属性。如果没有指定name属性,则使用id属性作为名称。
  • 在第一次部署具有特定密钥的进程时,版本1被分配。对于所有后续使用相同密钥的流程定义部署,版本将设置为比当前部署的最高版本高1。关键属性用于区分流程定义。
  • id属性设置为{processDefinitionKey}:{processDefinitionVersion}:{generated-id},其中generated-id是添加的唯一编号,以保证集群环境中流程定义缓存的进程ID的唯一性。

以下面的过程为例

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

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

ID名称
myProcess:1:676myProcess我重要的过程1

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

ID名称
myProcess:1:676myProcess我重要的过程1
myProcess:2:870myProcess我重要的过程2

当runtimeService.startProcessInstanceByKey(“myProcess”)被调用时,它将使用带有版本的流程定义2,因为这是流程定义的最新版本。我们是否应该创建第二个流程,如下所述,并将其部署到Flowable中,第三行将被添加到表中。

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

表格如下所示:

ID名称
myProcess:1:676myProcess我重要的过程1
myProcess:2:870myProcess我重要的过程2
myNewProcess:1:1033myNewProcess我重要的过程1

注意新流程的关键是如何不同于我们的第一个流程。即使名称是相同的(我们也可能已经改变了),Flowable只id在判别进程时考虑属性。新流程因此与版本1一起部署。

4、提供一个流程图

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

假设我们的类路径org/flowable/expenseProcess.bpmn20.xml上有一个进程,它有一个进程键的开销。适用于流程图图像的以下命名约定
(按此特定顺序):

  • 如果部署中存在具有与进程密钥和图像后缀连接的BPMN 2.0 XML文件名称的名称的映像资源,则使用此映像。在我们的例子中,这将是org/flowable/expenseProcess.expense.png(或.jpg / gif)。如果您在一个BPMN 2.0 XML文件中定义了多个图像,则此方法非常有用。每个图表图像将在其文件名中包含进程密钥。
  • 如果不存在这样的图像,则搜索与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);

5、生成过程图

如果在部署中没有提供图像,如前一节所述,如果流程定义包含必要的图交换信息,则Flowable引擎将生成流程图图像。资源可以以与在部署中提供图像时完全相同的方式检索。

如果出于某种原因,在部署过程中生成图表并不是必需或不可取的,则isCreateDiagramOnDeploy可以在流程引擎配置上设置该属性:

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

6、类别

部署和流程定义都具有用户定义的类别。流程定义类别使用BPMN XML中的targetNamespace属性的值进行初始化:<definitions …
targetNamespace=“yourCategory” …

部署类别也可以在API中指定,如下所示:

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

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:

以上是关于Flowable入门系列文章18 - 部署Flowable的主要内容,如果未能解决你的问题,请参考以下文章

Flowable入门系列文章80 - Flowable Designer部署功能

Flowable入门系列文章93 - 部署 01

Flowable入门系列文章95 - 部署 03

Flowable入门系列文章94 - 部署 02

Flowable入门系列文章3-部署流程定义

Flowable入门系列文章21 - 基本的Flowable概念二