写点什么

工作流部署详细解析!Spring 中部署 Activiti 流程定义的三种姿势

发布于: 2021 年 05 月 31 日
工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势

业务文档

  • 为了部署流程,需要包装在一个业务文档中

  • 一个业务文档是 Activiti 引擎部署的单元

  • 一个业务文档相当与一个压缩文件,它包含:

  • BPMN2.0 流程

  • 任务表单

  • 规则

  • 其他任意类型的文件

  • 业务文档是包含命名资源的容器

  • 当一个业务文档被部署,它将会自动扫描以.bpmn20.xml 或者.bpmn 作为扩展名的 BPMN 文件.每个那样的文件都将会被解析并且可能会包含多个流程定义


业务归档中的Java类将不能够添加到类路径下为了能够让流程运行,必须把存在于业务归档程中的流程定义使用的所有自定义的类(例如:Java服务任务或者实现事件的监听器)放在 [activiti引擎的类路径] 下
复制代码

编程式部署

  • 通过一个压缩文件(支持 Zip 和 Bar)部署业务文档

  • 也可以通过一个独立资源(例如 bpmn,xml 等)构建部署


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

通过 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 是一个唯一的数字被添加, 用于确保在集群环境中缓存的流程定义的唯一性


<definitions id="myDefinitions" >  <process id="myProcess" name="My important process" >    ...
复制代码


当部署了这个流程定义之后,数据库中的流程定义如下:



  • 假设部署用一个流程的最新版本号(改变用户任务),但是流程定义的 id 保持不变.流程定义表将包含以下列表信息:



runtimeService.startProcessInstanceByKey("myProcess") 方法被调用时,它将会使用流程定义版本号为 2 的, 因为这是最新版本的流程定义.可以说每次流程定义创建流程实例时,都会默认使用最新版本的流程定义


  • 创建第二个流程,在 Activiti 中,定义并且部署它,该流程定义会添加到流程定义表中:


<definitions id="myNewDefinitions" >  <process id="myNewProcess" name="My important process" >    ...
复制代码


  • 表结构如下所示:



  • 注意: 新流程的 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 文件夹中仅仅只有一个流程定义,这绝对是不会有问题的

  • 使用编程式的部署方式:


repositoryService.createDeployment()  .name("expense-process.bar")  .addClasspathResource("org/activiti/expenseProcess.bpmn20.xml")  .addClasspathResource("org/activiti/expenseProcess.png")  .deploy();
复制代码


  • 接下来,可以通过 API 来获取流程定义图片资源:


 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()                                                         .processDefinitionKey("expense")                                                         .singleResult();
String diagramResourceName = processDefinition.getDiagramResourceName(); InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);
复制代码

自动生成流程图片

  • 在部署的情况下没有提供图片,如果流程定义中包含必要的'图像交换'信息时,Activiti 流程引擎会自动生成一个图像

  • 该资源可以按照上面部署时提供流程图片完全相同的方式获取:

  • 如果因为某种原因,在部署的时候,并不需要或者不必要生成流程定义图片,那么就需要在流程引擎配置的属性中使用 isCreateDiagramOnDeploy 进行配置就可以不生成流程定义图片:


<property name="createDiagramOnDeploy" value="false" />
复制代码

类别

  • 部署和流程定义都是用户定义的类别

  • 流程定义类别在 BPMN 文件中属性的初始化的值:


<definitions ... targetNamespace="yourCategory" ... />
复制代码


  • 部署类别是可以直接使用 API 进行指定:


repositoryService    .createDeployment()    .category("yourCategory")    ...    .deploy();
复制代码


发布于: 2021 年 05 月 31 日阅读数: 12
用户头像

一位攻城狮的自我修养 2021.04.06 加入

分享技术干货,面试题和攻城狮故事。 你的关注支持是我持续进步的最大动力! https://github.com/ChovaVea

评论

发布
暂无评论
工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势