乐趣区

关于流程:项目中工作流部署详细解析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-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 key name version
      myProcess:1:676 myProcess My important process 1
  • 假如部署用一个流程的最新版本号(扭转用户工作), 然而流程定义的 id 放弃不变. 流程定义表将蕴含以下列表信息:
id key name version
myProcess:1:676 myProcess My important process 1
myProcess:2:870 myProcess My important process 2

runtimeService.startProcessInstanceByKey(“myProcess”) 办法被调用时, 它将会应用 流程定义版本号为 2 的, 因为这是最新版本的流程定义. 能够说每次流程定义创立流程实例时, 都会 默认应用最新版本的流程定义

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

    <definitions id="myNewDefinitions" >
    <process id="myNewProcess" name="My important process" >
      ...
  • 表构造如下所示:
id key name version
myProcess:1:676 myProcess My important process 1
myProcess:2:870 myProcess My important process 2
myNewProcess:1:1033 myNewProcess My important process 1
  • 留神: 新流程的 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();
退出移动版