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(下面有)
          在每个阶段指定负责人