工作流部署详细解析!Spring 中部署 Activiti 流程定义的三种姿势
业务文档
为了部署流程,需要包装在一个业务文档中
一个业务文档是 Activiti 引擎部署的单元
一个业务文档相当与一个压缩文件,它包含:
BPMN2.0 流程
任务表单
规则
其他任意类型的文件
业务文档是包含命名资源的容器
当一个业务文档被部署,它将会自动扫描以.bpmn20.xml 或者.bpmn 作为扩展名的 BPMN 文件.每个那样的文件都将会被解析并且可能会包含多个流程定义
编程式部署
通过一个压缩文件(支持 Zip 和 Bar)部署业务文档
也可以通过一个独立资源(例如 bpmn,xml 等)构建部署
通过 Activiti Explorer 控制台部署
Activiti web 控制台允许你通过 web 界面的用户接口上传一个 bar 格式的压缩文件(或者一个 bpmn20.xml 格式的文件).选择 Management 标签和点击 Deployment:
外部资源
流程定义保存在 Activiti 所支持的数据库中
当使用服务任务,执行监听器
从 Activiti 配置文件中配置的 Spring beans 时,流程定义能够引用这些委托类.
这些类或者 Spring 配置文件对于所有流程引擎中可能执行的流程定义必须是可用的
Java 类
当流程实例被启动的时候,在流程中被使用的所有自定义类应该存在流程引擎的类路径下:
服务任务中:
JavaDelegates
事件监听器
任务监听器
在部署业务文档时,这些类不必都存在于类路径下.当使用 Ant 部署一个新的业务文档时,意味着你的委托类不必存在类路径下
当使用示例设置添加自定义类:
应该添加包含自定义类的 jar 包到 activiti-explorer 控制台
activiti-rest 的 webapp lib 文件夹中
不要忽略包含你自定义类的依赖关系
还可以将你自定义的依赖添加到你的 Tomcat 容器的安装目录中的 ${tomcat.home}/lib
流程中使用 Spring beans
当表达式或者脚本使用 Spring beans 时,这些 beans 对于引擎执行流程定义时必须是可用的
如果要构建自定义的 web 应用并且按照 Spring 集成在应用上下文配置流程引擎.要记住,如果在使用 Activiti rest web 应用,那么也应该更新 Activiti rest web 应用的上下文.可以把在 activiti-rest/lib/activiti-cfg.jar 文件中的 activiti.cfg.xml 替换成的 Spring 上下文配置的 activiti-context.xml 文件
创建独立应用
可以将 Activiti rest web 应用加入到 web 应用之中,只需要配置一个 ProcessEngine,
从而不用确保所有的流程引擎的所有委托类在类路径下面并且是否使用正确的 spring 配置
流程定义的版本
BPMN 中并没有版本的概念,而在 Activiti 中,流程定义的版本会在部署时创建,在部署的时候,流程定义被存储到 Activiti 使用的数据库之前,Activiti 将会自动给流程定义分配一个版本号
业务文档中每一个的流程定义,都会通过下列部署执行初始化属性 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 保持不变.流程定义表将包含以下列表信息:
当 runtimeService.startProcessInstanceByKey("myProcess") 方法被调用时,它将会使用流程定义版本号为 2 的, 因为这是最新版本的流程定义.可以说每次流程定义创建流程实例时,都会默认使用最新版本的流程定义
创建第二个流程,在 Activiti 中,定义并且部署它,该流程定义会添加到流程定义表中:
表结构如下所示:
注意: 新流程的 key 与我们的第一个流程是不同的,尽管流程定义的名称 name 是相同的(当然,名称 name 也可以是不相同的),Activiti 仅仅只考虑 id 属性判断流程. 因此,新的流程定义部署的版本号为 1
提供流程图片
流程定义的流程图可以被添加到部署中,该流程图将会持久化到 Activiti 所使用的数据库中并且可以通过 Activiti 的 API 进行访问.
流程图也可以被用来在 Activiti Explorer 控制台中的流程中进行显示
如果在我们的类路径下面有一个流程:org/activiti/expenseProcess.bpmn20.xml, 该流程定义有一个流程 key=expense. 以下遵循流程定义图片的命名规范(按照这个特定顺序):
如果在部署时一个图片资源已经存在,是 BPMN2.0 的 XML 文件名,后面是流程定义的 key 并且是一个图片的后缀.那么该图片将被使用.
应该是 org/activiti/expenseProcess.expense.png(或者 jpg/gif).如果在一个 BPMN2.0 XML 文件中定义多个流程定义图片,这种方式更有意义.每个流程定义图片的文件名中都将会有一个流程定义 key
如果并没有这样的图片存在,部署的时候寻找与匹配 BPMN2.0 XML 文件的名称的图片资源
应该是 org/activiti/expenseProcess.png.注意:这意味着在同一个 BPMN2.0 XML 文件夹中的每个流程定义都会有相同的流程定义图片.因此,在每一个 BPMN 2.0 XML 文件夹中仅仅只有一个流程定义,这绝对是不会有问题的
使用编程式的部署方式:
接下来,可以通过 API 来获取流程定义图片资源:
自动生成流程图片
在部署的情况下没有提供图片,如果流程定义中包含必要的'图像交换'信息时,Activiti 流程引擎会自动生成一个图像
该资源可以按照上面部署时提供流程图片完全相同的方式获取:
如果因为某种原因,在部署的时候,并不需要或者不必要生成流程定义图片,那么就需要在流程引擎配置的属性中使用 isCreateDiagramOnDeploy 进行配置就可以不生成流程定义图片:
类别
部署和流程定义都是用户定义的类别
流程定义类别在 BPMN 文件中属性的初始化的值:
部署类别是可以直接使用 API 进行指定:
版权声明: 本文为 InfoQ 作者【攻城狮Chova】的原创文章。
原文链接:【http://xie.infoq.cn/article/d33b1df889f9ceae25ea4002a】。文章转载请联系作者。
评论