摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍。

本文分享自华为云社区《项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势》,作者:攻城狮Chova 。

业务文档

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

    • 一个业务文档是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-restwebapp 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,nameid:
    • 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();

点击关注,第一时间了解华为云新鲜技术~

Spring中部署Activiti流程定义的三种姿势相关推荐

  1. Spring中的AOP切面编程的三种实现方式

    文章目录 Spring中的AOP切面编程的三种实现方式 1.最基本AOP的实现 a.引入jar包 b.编写通知类,这里以后置通知和环绕通知类为例子进行说明 c.在SpringIOC容器中配置 d.测试 ...

  2. activiti删除已经部署的流程定义

    import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.acti ...

  3. Activiti流程定义缓存源码分析7-流程缓存自定义

    接下来,重点看一下Activiti中如何自定义流程缓存. 上面我们提到过自定义类首先需要继承StandaloneProcessEngineConfiguration类并通过动态属性注入方式为引擎配置类 ...

  4. vue 函数 路由跳转_vue中通过路由跳转的三种方式

    router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...

  5. 在HTML中使用CSS美化网页的三种方法

    在HTML中使用CSS美化网页的三种方法 CSS是Cascading Style Sheets(级联样式表)的缩写,CSS是一种样式表语言,用于为HTML文档定义布局.例如,CSS涉及字体.颜色.边距 ...

  6. haproxy中acl的与或非三种規則写法

    haproxy中acl的与或非三种規則写法 当我们在haproxy里面需要使用use_backend或http-request等语句去调用定义过的acl规则时,可以跟平时写程序一样,使用与,或,非三种 ...

  7. 分布式部署_Apache Spark探秘:三种分布式部署方式比较

    [本文详细介绍了Spark的三种部署方式及其比较,欢迎读者朋友们阅读.转发和收藏!] 目前Apache Spark支持三种分布式部署方式,分别是 standalone . spark on mesos ...

  8. vbs执行ctrl+空格_VBS中解决路径带空格的三种方法

    vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...

  9. 安卓在子线程中实现更新UI界面的三种方法 Handler+Message、runOnUiThread、控件.post()

    1.说明 安卓中UI线程为主线程,更新UI界面必须在主线程中进行,在子线程中实现更新UI界面的三种方法:Handler.RunOnUiThread.控件.post() 2.1 Handler (1)定 ...

最新文章

  1. Ubuntn删除软件
  2. Java获取当前路径和读取文件
  3. 首次公开:京东数科强一致、高性能分布式事务中间件 JDTX
  4. Potplayer使用必看
  5. 太网设计FAQ:以太网MAC和PHY
  6. C++ 学习之旅(2)——链接器Linker
  7. Bootstrap中的下拉列表
  8. 李宏毅机器学习(七)自监督学习(二)BERT奇闻轶事
  9. Chrome、Edge 合力围剿,Safari 夹缝求生?
  10. wordpress主题-一款功能强大的综合类型wordpress模板
  11. 【网站】给网站添加一个夜间模式切换按钮
  12. Linux/Documentations: Kernel Livepatching
  13. 利用递归遍历文件夹和文件存入TreeView
  14. 【云栖精选】6篇深度!解除MySQL数据同步疑惑+Docker技术示例
  15. Alamofire拦截请求AOP,URLProtocol
  16. php汉字首字母缩写,中文转拼音缩写(php版本复制可用)
  17. 数量关系--容斥原理
  18. 激光传感器构建栅格地图
  19. What Is Harmony OS? Huawei’s New Operating System Explained
  20. 海康摄像机在Win10系统的Web浏览器中无法在线预览解决办法

热门文章

  1. 免费开源低代码拖拽开发_资料来源:面向开源开发人员的免费代码搜索工具
  2. get set方法简化_简化开放科学的4种方法
  3. 前端:HTML/07/综合案例:月福首页,开发网站的流程,网站布局结构,排版准备,图片热点,网页多媒体
  4. 十进制负数的二进制表示法
  5. Bootstrap Page header
  6. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析
  7. 计算机健康教育应用的意义,【计算机信息论文】计算机信息在心理健康教育中的实效性(共2561字)...
  8. bjca客户端 win10_BJCA证书助手 V2.14.4 官方版
  9. flutter 移动通知_Flutter开发之动画
  10. php接收get参数false是字符串,php怎么接收url参数