部署
外部资源
用例定义存放在 Flowable 数据库中。当使用服务任务或来自 Flowable 配置文件的 Spring Bean 时,这些用例定义可以引用委托类。这些类以及 Spring 配置文件必须对所有可能执行该用例定义的 CMMN 引擎可用。
Java 类
当启动用例实例时,用例定义中使用的所有自定义类(例如服务任务中使用的 PlanItemJavaDelegate)都应位于引擎的 classpath 上。
然而,在用例定义部署期间,这些类不必位于 classpath 上。这意味着,例如在部署新的用例定义时,你的委托类不必位于 classpath 上。
当你使用演示环境并想添加自定义类时,应将包含这些类的 JAR 添加到 flowable-task 或 flowable-rest Web 应用的 lib 中。不要忘记同时包含自定义类的依赖(如果有的话)。或者,你也可以将依赖放入 Tomcat 安装目录的 libraries 目录,即 ${tomcat.home}/lib(或其他 Web 容器的类似位置)。
从用例实例使用 Spring Bean
当表达式或脚本 使用 Spring Bean 时,在执行用例定义时这些 Bean 必须对引擎可用。如果你正在构建自己的 Web 应用,并按照 Spring 集成小节 中所述在自己的上下文中配置 CMMN 引擎,那么这很简单。但请记住,如果你使用了该上下文,也应相应地更新 Flowable task 和 rest Web 应用。
用例定义的版本管理
CMMN 本身没有版本管理的概念。这其实是好事,因为可执行的 CMMN 文件很可能作为开发项目的一部分存放在版本控制系统仓库(如 Subversion、Git 或 Mercurial)中。然而,用例定义的版本会在引擎中作为部署的一部分创建。在部署期间,Flowable 会在将 CaseDefinition 存入 Flowable 数据库之前为其分配一个版本号。
对于一次部署中的每个用例定义,会执行以下步骤来初始化 key、version、name 和 id 属性:
- XML 文件中的用例定义 id 属性被用作用例定义的 key 属性。
- XML 文件中的用例定义 name 属性被用作用例定义的 name 属性。如果未指定 name 属性,则使用 id 属性作为 name。
- 当某个 key 的用例第一次被部署时,分配版本 1。对于使用相同 key 部署的后续用例定义,版本号将比当前已部署的最高版本高 1。key 属性用于区分不同的用例定义。
以下面这个用例为例:
<definitions id="myDefinitions" >
<case id="myCase" name="My important case" >
...
部署该用例定义后,数据库中的用例定义如下所示:
| id | key | name | version |
|---|---|---|---|
| 676 | myCase | My important case | 1 |
假设我们现在部署同一个用例的更新版本(例如修改了一些人工任务),但用例定义的 id 保持不变。此时用例定义表将包含以下条目:
| id | key | name | version |
|---|---|---|---|
| 676 | myCase | My important case | 1 |
| 870 | myCase | My important case | 2 |
当调用 runtimeService.createCaseInstanceBuilder().caseDefinitionKey("myCase").start() 时,将使用版本 2 的用例定义,因为它是该用例定义的最新版本。
如果我们再创建一个如下定义的用例并将其部署到 Flowable,表中将新增第三行。
<definitions id="myNewDefinitions" >
<case id="myNewCase" name="My important case" >
...
表格将如下所示:
| id | key | name | version |
|---|---|---|---|
| 676 | myCase | My important case | 1 |
| 870 | myCase | My important case | 2 |
| 1033 | myNewCase | My important case | 1 |
注意新用例的 key 与第一个用例不同。尽管 name 相同(我们大概也应该改掉它),Flowable 在区分用例时只考虑 id 属性。因此新用例以版本 1 部署。
类别
部署和用例定义都有用户定义的类别。用例定义的类别初始化为 CMMN XML 中 targetNamespace 属性的值:<definitions ... targetNamespace="yourCategory" ...
部署类别也可以在 API 中指定,如下所示:
repositoryService
.createDeployment()
.category("yourCategory")
...
.deploy();