跳到主要内容

部署

Doubao 中英对照 Deployment

Event Registry 定义​

Event Registry 支持两种类型的定义,即 Event 定义和 Channel 定义。Event 定义使用 .event 扩展名,Channel 定义使用 .channel 扩展名。

当 Event Registry 引擎与 Process 引擎一起使用时,Event 和 Channel 定义可以与其他流程相关资源一起打包到业务归档(BAR)中。Process 引擎的部署服务将负责将 Event 和 Channel 资源部署到 Event Registry 引擎。

注意

业务归档中用于自定义表达式函数的 Java 类不会被添加到 classpath。业务归档中事件和通道定义表达式里使用的所有自定义类都应存在于 Flowable(Event Registry)引擎 classpath 上。

Event 定义​

Event 定义配置事件载荷结构以及关联和租户检测。部署 Event 定义时,会向 FLW_EVENT_DEFINITION 表插入一条新定义。

以编程方式部署 Event 定义​

可以像这样部署 Event 定义:

String eventDefinition = "path/to/definition-one.event"; //Don't forget the .event extension!

repositoryService.createDeployment()
.name("Deployment of Event definition-one")
.addClasspathResource(eventDefinition)
.deploy();

你可以使用其他方法将 Event 定义添加到部署中,例如 addInputStream。下面是从外部文件部署 Event 定义的示例:

File eventFile = new File("/path/to/definition-two.event"); //Don't forget the .event extension!

repositoryService.createDeployment()
.name("Deployment of Event definition-two")
.addInputStream(eventFile.getName(), new FileInputStream(eventFile))
.deploy();

部署名称可以是任意文本,但资源名称必须始终包含有效的 Event 定义资源名后缀(".event")。

Channel 定义​

Channel 定义配置传入或传出事件的源或目标目的地。默认情况下,Flowable Event Registry 支持 JMS、Kafka 和 RabbitMQ 源和目标目的地,但也可以用其他适配器类型扩展。部署 Channel 定义时,会向 FLW_CHANNEL_DEFINITION 表插入一条新定义。

以编程方式部署 Channel 定义​

可以像这样部署 Channel 定义:

String channelDefinition = "path/to/definition-one.channel"; //Don't forget the .channel extension!

repositoryService.createDeployment()
.name("Deployment of Channel definition-one")
.addClasspathResource(channelDefinition)
.deploy();

你可以使用其他方法将 Event 定义添加到部署中,例如 addInputStream。下面是从外部文件部署 Event 定义的示例:

File channelFile = new File("/path/to/definition-two.channel"); //Don't forget the .channel extension!

repositoryService.createDeployment()
.name("Deployment of Channel definition-two")
.addInputStream(channelFile.getName(), new FileInputStream(channelFile))
.deploy();

部署名称可以是任意文本,但资源名称必须始终包含有效的 Channel 定义资源名后缀(".channel")。

Java 类​

执行决策时,所有包含你的 Event 和 Channel 中所使用自定义表达式函数的类都应存在于引擎的 classpath 上。

不过,在部署 Event 或 Channel 定义时,这些类不必存在于 classpath 上。

当你使用 demo 安装并想添加自定义类时,应将包含你的类的 JAR 添加到 flowable-app-rest webapp 的 lib 中。别忘了同时包含自定义类的依赖(如果有)。或者,你可以将依赖包含在 Tomcat 安装的库目录 ${tomcat.home}/lib 中。

创建单一应用​

与其确保所有 Event Registry 引擎都在其 classpath 上拥有所有委派类并使用正确的 Spring 配置,你可以考虑将 flowable-rest webapp 包含在你自己的 webapp 中,从而只有一个 EventRegistryEngine。

Event 和 Channel 定义的版本控制​

部署时,Flowable 会在将 Event 和 Channel 定义存储到 Flowable 数据库之前为它们分配一个版本。

对于每个 Event 和 Channel 定义,会执行以下步骤来初始化属性 key、version、name 和 id:

  • 定义 JSON 文件中的 event 或 channel key 属性用作定义 key 属性。
  • JSON 文件中的 name 属性用作定义 name 属性。
  • 第一次部署具有某个特定 key 的 Event 或 Channel 定义时,分配版本 1。对于后续部署具有相同 key 的 Event 或 Channel 定义,版本将设为比当前已部署的最大版本高 1。key 属性用于区分 Event 和 Channel 定义。
  • id 属性是一个唯一编号,用于保证集群环境中缓存所用 Event 和 Channel 定义标识符的唯一性。

下面以以下流程为例:

{
"key": "myEvent",
"name": "My event",
...

部署此 Event 定义时,它将如下所示:

idkeyname版本
e29d4126-ed4d-11e6-9e00-7282cbd6ce64myEvent我的事件1

假设我们现在部署同一个 Event 定义的更新版本,但 Event 定义的 key 保持不变。Event 定义表现在将包含以下条目:

idkeyname版本
e29d4126-ed4d-11e6-9e00-7282cbd6ce64myEvent我的事件1
e9c2a6c0-c085-11e6-9096-6ab56fad108amyEvent我的事件2

调用 eventRegistry.getEventModelByKey("myEvent") 时,它现在将使用版本 2 的 Event 定义,因为这是该 Event 定义的最新版本。

如果我们创建第二个决策(如下所定义)并将其部署到 Flowable DMN,表中将添加第三行。

{
"key": "myNewEvent",
"name": "My new event",
...

该表将如下所示:

idkeyname版本
e29d4126-ed4d-11e6-9e00-7282cbd6ce64myEvent我的事件1
e9c2a6c0-c085-11e6-9096-6ab56fad108amyEvent我的事件2
d317d3f7-e948-11e6-9ce6-b28c070b517dmyNewEvent我的新事件1

注意新 Event 定义的 key 与我们第一个 Event 定义的 key 不同。即使 name 相同,Flowable Event Registry 在区分 Event 和 Channel 时只考虑 key 属性。因此新 Event 定义以版本 1 部署。