关于工作流:Activiti工作流入门筑基上篇修身

37次阅读

共计 8921 个字符,预计需要花费 23 分钟才能阅读完成。

Activiti 工作流

一、我不是韩立,我叫厉飞雨

  • 一、工作流的简略理解

    • 1、介绍:将一组工作组织起来以实现某个事件的过程:定义了工作的触发程序和触发条件,每个工作能够由一个或多个 软件系统 实现,也能够由一个或一组人实现,还能够由一个或多集体与软件系统合作实现。
      只有牵扯到了多个角色的多个工作都能够应用
    • 1- 1 目前常见的工作流程有两种形式:
      (1)通过状态字段实现流程管制。原始,适宜简略流程管制。
      (2)工作流引擎实现流程管制。实用场景更宽泛,扩展性更好。
    • 2、实现原理:
      不扭转代码的前提下实现各种业务流程的治理,适用性,扩展性很优良。
      activiti 通过创立流程实例引擎,能够实现不同流程的流转,通过一直读取创立的流程节点实现流程流转。
    • 3、工作流引擎分类

      工作流引擎 性能 文档 环境部署
      Activiti 反对绝大部分工作流性能,合乎中国国情的审批流程须要在此基础上进行开发。 文档丰盛,csdn 有相应专栏,并且国人奉献了一本《activiti 实战》具体的解说了基于 activiti 的开发内容,网上教程资源丰盛。 官网提供 webapp war 包,部署在 Tomcat 下可疾速操作和理解 activiti,eclipse 提供反对 activiti 我的项目的 ide 插件,总的来说环境反对良好。
      jBPM 反对绝大部分工作流程,合乎中国国情的审批需持续二次开发。 中文文档绝对匮乏,网上教程资源参考价值不大。
      jFlow 反对大部分流程的根底性能:后退、后退、转向、转发、撤销、抄送、挂起、草稿、委托代办,也反对高级性能取回审批、项目组、内部用户等 公司提供残缺具体的接口文档和操作手册,属于国内公司开源我的项目,有专门的 BBS 论坛 官网提供疾速运行体验 http://demo.ccflow.org/,也可依照教程部署到本地 Tomcat 下拜访本地 http://127.0.0.1:8080/jflow-web/ 地址测试。
      • activiti
        Activiti 是由 jBPM 的创立 Tom Baeyen 离 JBoss 之后建设的我的项目,构建在开发 jBPM 版本 1 到 4 时积攒的多年教训的根底之上,旨在创立下一代的 BPM 解决方案。

        Activity 绝对简略,仅有流程引擎,没有表单引擎。在 BPM 的钻研畛域, 很多的学者,专家都是把流程引擎与表单引擎离开的

        流程定义是线下依照 bpmn2.0 规范去形容业务流程,通常应用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种形式都遵循 bpmn2.0 规范。
        劣势
        从技术组成来看,Activiti 最大的劣势是采纳了 PVM(流程虚拟机),反对除了 BPMN2.0 标准之外的流程格局,与内部服务有良好的集成能力,连续了 jBPM3、jBPM4 良好的社区反对,服务接口清晰,链式 API 更为优雅
        Activiti 上手比拟快,界面也比拟简洁、直观
        Activiti 绝对丰盛的材料,并且高度与 SpringBoot 集成
        成熟、稳固、满足 BPMN2.0 标准
        用户泛滥,社区沉闷,趋势良好
        易于上手,基于 Spring、MyBatis 罕用互联网技术堆栈作为技术底层
        劣势
        长久化层没有遵循 JPA 标准
        Activiti 对表单的反对目前还是比拟弱的,流程表单设计还是须要开发人员去解决
        Activiti 的简略 demo 试验不难,然而若想结合实际业务灵便应用 Activiti,须要破费不少工夫。

      • flowable
        简介
        2016 年 10 月,Activiti 工作流引擎的次要开发者来到 Alfresco 公司并在 Activiti 分支根底上开启了 Flowable 开源我的项目, 是 Activiti 的一个分支
        activiti5 以及 activiti6、flowable 是 Tijs Rademakers 团队开发的。
        Activiti7 是 Salaboy 团队开发的。activiti6 以及 activiti5 代码目前有 Salaboy 团队进行保护。因为 Tijs Rademakers 团队去开发 flowable 框架了,所以 activiti6 以及 activiti5 代码曾经交接给了 Salaboy 团队(能够了解为到职之前工作交接)。目前的 activiti5 以及 activiti6 代码还是原 Tijs Rademakers 原有团队开发的。Salaboy 团队目前在开发 activiti7 框架。对于 activiti6 以及 activiti5 的代码官网曾经声称暂停保护了。activiti7 就是噱头 内核应用的还是 activiti6。并没有为引擎注入更多的新个性,只是在 activiti 之外的下层封装了一些利用。activiti6 的很多框架 bug 在 flowable 框架中曾经修复的差不多了, 能够实现零老本从 activiti 迁徙到 flowable
        也新增了很多性能, 如 flowable 反对 jms、rabbitmq、mongodb 等形式解决历史数据
      • jBPM
        简介
        jBPM 是公开源代码我的项目,jBPM 在 2004 年 10 月 18 日,公布了 2.0 版本,并在同一天退出了 JBoss,成为了 JBoss 企业中间件平台的一个组成部分,它的名称也改成 JBoss jBPM。
        劣势
        jBPM 最大的劣势是采纳了 Apache Mina 异步通信技术,采纳 JPA/JTA 长久化方面的规范,以功能齐全的 Guvnor 作为流程仓库,有 RedHat(http://jBoss.org 被红帽收买) 的专业化反对
        劣势
        对本身技术依赖过紧且目前仅反对 BPMN2
        JBPM 网上集成的材料甚少,且新版本绝对比拟轻便。
        jBPM7 次要与 JBoss 下的规定引擎集成较好
      • jFlow
        简介
        jFlow 属于济南驰骋信息技术有限公司的开源我的项目,向社会 100% 开源。研发于 2003 年,到始终继续到当初,功能强大丰盛,图形化的配置,功能性配置较高,在中国国情下成长起来的优良的工作流引擎。在国内有肯定的市场位置,是国内驰名的老牌工作流引擎。
        前身 ccFlow,.NET 开源的工作流. jFlow 是 java 版本
        劣势
        jFlow 是 JFlow 流程引擎 +CCForm 的表单引擎的有机联合,内容绝对简单,配置程度较高,施行周期短,上手快。
        劣势
  • Activiti 引擎:

    • 1、介绍
      1、建模业务流程的规范规定,一个流程由一个流动或多个流动组成。
      事件 Event:Start 开始,end 完结,IntermediateCatching 两头
      流动 Activity:User Task 用户工作,Service Task 服务工作,Sub Process 子流程
      网关 GateWay:InclusiveGateWay 并行网关,ExclusiveGateWay 排他网关,EventGateWay 事件网关
    • 2、应用
      个别状况下都是通过创立 BPMN 进行业务流程建模,两种形式,idea 插件或者 eclipse 插件,通过符号创立流程。
      Activiti 插件叫 actiBPM,官网对应的 idea 只更新到了 2019.1.4 版本(应用 idea2019.1.4 之前的版本上面步骤根本能够跳过),往后的 idea 版本都不能够应用,往后的版本能够应用 Activiti BPMN visualize 这个插件,相差不大

      装置实现后能够看见

      右键创立好的 BPMN 文件能够看到

      ![2022-03-16_150849.png](/img/bVcYyzl)
      
      • 装置流程图设计器
        camunda-modeler
        基于 bpmn.io 的面向 BPMN DMN 和 CMMN 的集成建模解决方案,camunda-modeler 是一款内部流程设计器,同一般装置软件一样装置完后双击.exe 程序即可应用,也能够通过 IDEA 装置内部 Tool 应用。
        链接:https://pan.baidu.com/s/1b9ZQHwuRZZUU7N3UW-qmtQ
        提取码:juzi
        装置解压即可应用
        idea 配置 camunda-modeler

        右键滑到 External Tools 有显示设计器即可
      • 3、入门

        • 第一步:增加 maven 依赖

           <!-- 对立治理版本 activiti 的相干包 mysql 的驱动包 mybatis log4j 数据库链接池 -->
              <properties>
                  <slf4j.version>1.6.6</slf4j.version>
                  <log4j.version>1.2.12</log4j.version>
                  <activiti.version>7.0.0.Beta1</activiti.version>
              </properties>
              <dependencies>
                  <dependency>
                      <groupId>org.activiti</groupId>
                      <artifactId>activiti-engine</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.activiti</groupId>
                      <artifactId>activiti-spring</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <!-- bpmn 模型解决 -->
                  <dependency>
                      <groupId>org.activiti</groupId>
                      <artifactId>activiti-bpmn-model</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <!-- bpmn 转换 -->
                  <dependency>
                      <groupId>org.activiti</groupId>
                      <artifactId>activiti-bpmn-converter</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <!-- bpmn json 数据转换 -->
                  <dependency>
                      <groupId>org.activiti</groupId>
                      <artifactId>activiti-json-converter</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <!-- bpmn 布局 -->
                  <dependency>
                      <groupId>org.activiti</groupId>
                      <artifactId>activiti-bpmn-layout</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <!-- activiti 云反对 -->
                  <dependency>
                      <groupId>org.activiti.cloud</groupId>
                      <artifactId>activiti-cloud-services-api</artifactId>
                      <version>${activiti.version}</version>
                  </dependency>
                  <!-- mysql 驱动 -->
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                      <version>5.1.40</version>
                  </dependency>
                  <!-- mybatis -->
                  <dependency>
                      <groupId>org.mybatis</groupId>
                      <artifactId>mybatis</artifactId>
                      <version>3.4.5</version>
                  </dependency>
                  <!-- 链接池 -->
                  <dependency>
                      <groupId>commons-dbcp</groupId>
                      <artifactId>commons-dbcp</artifactId>
                      <version>1.4</version>
                  </dependency>
                  <dependency>
                      <groupId>junit</groupId>
                      <artifactId>junit</artifactId>
                      <version>4.12</version>
                  </dependency>
                  <!-- log start -->
                  <dependency>
                      <groupId>log4j</groupId>
                      <artifactId>log4j</artifactId>
                      <version>${log4j.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.slf4j</groupId>
                      <artifactId>slf4j-api</artifactId>
                      <version>${slf4j.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>org.slf4j</groupId>
                      <artifactId>slf4j-log4j12</artifactId>
                      <version>${slf4j.version}</version>
                  </dependency>
                  <dependency>
                      <groupId>commons-io</groupId>
                      <artifactId>commons-io</artifactId>
                      <version>2.6</version>
                  </dependency>
              </dependencies>
        • 第二步:创立 activiti 的 xml 配置文件 activiti.cfg.xml,放在配置文件目录下

              // 配置文件内容
              <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans
                              http://www.springframework.org/schema/beans/spring-beans.xsd">
          
              // 配置数据源 dbcp 连接池
              <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
                  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                  <property name="url" value="jdbc:mysql://localhost:3306/ 数据库名"/>
                  <property name="username" value="用户名"/>
                  <property name="password" value="明码"/>
                  // 最大沉闷数
                  <property name="maxActive" value="3"/>
                  // 最大闲暇数
                  <property name="maxIdle" value="1"/>
              </bean>
              <!-- 在默认形式下 bean 的 id  固定为 processEngineConfiguration-->
              <bean id="processEngineConfiguration"
                    class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
                  <!-- 间接援用下面配置的链接池 -->
                  <property name="dataSource" ref="dataSource"/>
                  <!--
                   对于 processEngineConfiguration 中的 databaseSchemaUpdate 参数,通过此参数设计 activiti
                      数据表的解决策略,参数如下:false(默认):查看数据库表的版本和依赖库的版本,如果版本不匹配就抛出异样。true: 构建流程引擎时,执行查看,如果须要就执行更新。如果表不存在,就创立。create-drop: 构建流程引擎时创立数据库表,敞开流程引擎时删除这些表。drop-create:先删除表再创立表。create: 构建流程引擎时创立数据库表,敞开流程引擎时不删除这些表。-->
                  <property name="databaseSchemaUpdate" value="true"/>
              </bean>
          </beans>
        • 第三步:编写代码

          public class ActivitiInit {
               // 默认形式
          
              @Test
              public void GenActivitiTables2() {
                  // 条件:1.activiti 配置文件名称:activiti.cfg.xml   2.bean 的 id="processEngineConfiguration"
                  ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
                  System.out.println(processEngine);
              }
              
              // 利用配置文件创立
               @Test
               public void GenActivitiTables1(){
                   // 1. 创立 ProcessEngineConfiguration 对象。第一个参数:配置文件名称;第二个参数:processEngineConfiguration 的 bean 的 id
                  ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");
                  // 2. 创立 ProcessEngine 对象
                  ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();}
          
            
                // 也能够通过纯代码生成不应用配置文件,手动连贯数据源创立  
                @Test
                public void createProcessEngine1(){
                  // 创立 ProcessEngineConfiguration 对象
                  ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration.
                          createStandaloneProcessEngineConfiguration();
                  // 设置数据库连贯属性
                  engineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
                  engineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/ 数据库名?createDatabaseIfNotExist=true" +
                      "&useUnicode=true&characterEncoding=utf8");
                  engineConfiguration.setJdbcUsername("用户名");
                  engineConfiguration.setJdbcPassword("明码");
                  // 设置创立表的策略(当没有表时,主动创立表)//      public static final java.lang.String DB_SCHEMA_UPDATE_FALSE = "false";// 不会主动创立表,没有表,则抛异样
                //      public static final java.lang.String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";// 先删除,再创立表
                //      public static final java.lang.String DB_SCHEMA_UPDATE_TRUE = "true";// 如果没有表,则主动创立
                  engineConfiguration.setDatabaseSchemaUpdate("true");
                  // 通过 ProcessEngineConfiguration 对象创立 ProcessEngine 对象
                  ProcessEngine processEngine = engineConfiguration.buildProcessEngine();
                  System.out.println("流程引擎创立胜利");
                  processEngine.close();}
        • 第四步:执行代码生成数据库
          activiti 默认初始化 25 张表,执行第三步的代码后去数据库查看

          Activiti 的表都以 ACT_结尾。第二局部是示意表的用处的两个字母标识。用处也和服务的 API 对应。ACT_RE_*: 'RE' 示意 repository。这个前缀的表蕴含了流程定义和流程动态资源(图片,规定,等等)。ACT_RU_*: 'RU' 示意 runtime。这些运行时的表,蕴含流程实例,工作,变量,异步工作,等运行中的数据。Activiti 只在流程实例执行过程中保留这些数据,在流程完结时就会删除这些记录。这样运行时表能够始终很小速度很快。ACT_HI_*: 'HI' 示意 history。这些表蕴含历史数据,比方历史流程实例,变量,工作等等。ACT_GE_*: 'GE' 示意 general。通用数据,用于不同场景下
          
          ** 具体的表阐明网上都有这里就不写了
          **
        • 第五步:创立流程图

          创立 BPMN 文件后,右键

          能够看到

          创立图标后能够点击右上角的箭头拖动到其余组件中,点击组件下方会有具体的信息展现,给 Name 赋值就能够看到对应的信息

          创立后可通过 Camunda Modeler 关上文件,生成流程图能够通过 Camunda Modeler 间接生成,也能够在 idea 流程外面点击 save to PNG(下面有)
          在每个阶段指定负责人

正文完
 0