zoukankan      html  css  js  c++  java
  • activiti入门学习一

    一、什么是Activiti?

      Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。说白了activiti是一个业务流程管理引擎,会沿着设计者设计好的流程,一步一步的执行下去,直到终点。

    二、activiti配置讲解

    • 使用idea开发,需要安装bpmn插件
      在这里插入图片描述

    • pom文件

      <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-engine</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
    
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-spring</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
    
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-bpmn-model</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
    
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-bpmn-converter</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
    
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-json-converter</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
    
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-bpmn-layout</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
    
            <dependency>
                <groupId>org.activiti.cloud</groupId>
                <artifactId>activiti-cloud-services-api</artifactId>
                <version>7.0.0.Beta1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.15</version>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.4</version>
            </dependency>
    
    • activiti配置文件 
      在这里插入图片描述
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    						http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
    						http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jdbcUrl"  value="jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
            <property name="jdbcUsername" value="root"/>
            <property name="jdbcPassword" value="root"/>
            <property name="databaseSchemaUpdate" value="true"/>
        </bean>
    </beans>
    
    • activiti所需的25张表
     public static void main(String[] args) {
    //        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
    //        ProcessEngine processEngine = cfg.buildProcessEngine();
    //        System.out.println(processEngine);
    
    
    //创建方式二  采用默认配置,xml和bean的id  processEngineConfiguration
            ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
            System.out.println(defaultProcessEngine);
        }
    

    在这里插入图片描述

     ACT_RE_: RE表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)
     
    ACT_RU_: RU表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直
    很小速度很快。
     
    ACT_HI_: HI表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
     
    ACT_GE_
    **: GE 表示 general。通用数据, 用于不同场景下。

    • activiti提供的service介绍
      RepositoryService activiti 的资源管理类
       RuntimeService activiti 的流程运行管理类
       TaskService activiti 的任务管理类
       HistoryService activiti 的历史管理类
       ManagerService activiti 的引擎管理类

    三、流程图定义

    在这里插入图片描述

    • 流程定制
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • 导出图片
      导出图片之前需要先将idea的文件配置成utf-8,不然流程定义中的文字会出现乱码的情况
      在这里插入图片描述
      在这里插入图片描述

    然后将创建的bpmn后缀名给为xml
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    如果没有提前修改idea配置文件为utf-8的话,这里会出现乱码
    在这里插入图片描述

    然后在将之前修改成xml的后缀名在修改成bpmn
    在这里插入图片描述

    四、单机演示Demo

    1、流程定义到数据库中,此操作影响的表

      public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到 RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //开始部署
            Deployment deployment = repositoryService.createDeployment()
                    //添加资源
                    .addClasspathResource("bpmn/holiday.xml")
                    .addClasspathResource("bpmn/holiday.png")
                    .name("请假流程审批")
                    .deploy();
            System.out.println("流程部署id:" + deployment.getId());
    
            System.out.println("流程部署名称:" + deployment.getName());
        }
    
    • 部署信息
      在这里插入图片描述

    • 流程定义的信息,唯一的key
      在这里插入图片描述

    • 定义的bpmn文件和png文件
      在这里插入图片描述

    2、启动流程实例,此操作影响的表

      public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到 RuntimeService
            RuntimeService runtimeService = processEngine.getRuntimeService();
    
            //创建流程实例  需要知道流程定义的key
            ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday");
    
            System.out.println("流程部署ID "+holiday.getDeploymentId());
            System.out.println("流程实例ID "+holiday.getId());
            System.out.println("流程的Key "+holiday.getBusinessKey());
            System.out.println("活动Id "+holiday.getActivityId());
        }
    
    • 已完成的活动信息
      在这里插入图片描述

    • 参与者信息
      在这里插入图片描述

    • 流程实例
      在这里插入图片描述

    • 任务实例
      在这里插入图片描述

    • 执行表
      在这里插入图片描述

    • 参与者信息
      在这里插入图片描述

    • 任务
      在这里插入图片描述

    3、查询任务

     public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
    
            //根据流程定义的key和负责人查询当前用户的任务列表
            List<Task> list = taskService.createTaskQuery()
                    .processDefinitionKey("holiday")
                    .taskAssignee("wanwu")
                    .list();
            for (Task task : list) {
                System.out.println("流程实例Id "+task.getProcessInstanceId());
                System.out.println("任务Id "+task.getId());
                System.out.println("负责人名称 "+task.getAssignee());
                System.out.println("任务名称 "+task.getName());
    
            }
    
        }
    

    在这里插入图片描述

    4、处理任务

     public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取TaskService对象
            TaskService taskService = processEngine.getTaskService();
    
            //处理任务   任务ID2505,上面已经查询到的
            taskService.complete("2505");
    
        }
    
    • 影响的表和启动实例的时候差不多
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    这个表只存储当前流程的下一个执行任务

    5、流程定义的查询

       public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到RepositoryService
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //得到ProcessDefinitionQuery对象   可以认为是一个查询器
            ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
    
            //设置流程定义的Key
            List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday")
                    //设置排序方式 默认是根据流程定义的版本号排序
                    .orderByProcessDefinitionVersion().desc()
                    .list();
    
            for (ProcessDefinition processDefinition : holiday) {
                System.out.println("流程定义的ID " +processDefinition.getId());
                System.out.println("流程定义名称 " +processDefinition.getName());
                System.out.println("流程定义Key " +processDefinition.getKey());
                System.out.println("流程定义的版本号 " +processDefinition.getVersion());
                System.out.println("流程部署的ID  " +processDefinition.getDeploymentId());
            }
        }
    

    在这里插入图片描述

    6、删除已部署的流程

     public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //执行删除   参数是部署ID
            //repositoryService.deleteDeployment("2501");
    
            
            //如果流程没有执行完成 删除时候回出错,如果强制删除也是可以的是级联删除
            //级联删除   执行但为完成的也是可以删除的   true会先删除没有完成的流程节点,最后删除流程定义信息
            repositoryService.deleteDeployment("2501",true);
    
        }
    
    

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    流程删除和流程部署影响的表一样的
    7、流程定义资源查看

      public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到HistoryService
            HistoryService historyService = processEngine.getHistoryService();
    
            HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
    
            //查询条件
            historicActivityInstanceQuery.processInstanceId("5001");
    
            //执行流程
            List<HistoricActivityInstance> list = historicActivityInstanceQuery
                    .orderByHistoricActivityInstanceStartTime().asc()
                    .list();
            for (HistoricActivityInstance historicActivityInstance : list) {
                System.out.println(historicActivityInstance.getActivityId());
                System.out.println(historicActivityInstance.getActivityName());
                System.out.println(historicActivityInstance.getProcessDefinitionId());
                System.out.println(historicActivityInstance.getProcessInstanceId());
    
            }
    
        }
    
    

    在这里插入图片描述

    8、使用压缩包部署Activiti
    将流程图和bpmn文件压缩成zip格式的

      public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到 RepositoryService对象
            RepositoryService repositoryService = processEngine.getRepositoryService();
    
            //转换ZipInputStream流对象
            InputStream is = ActivitiZipDeployment.class.getClass().getClassLoader().getResourceAsStream("bpmn/holiday.zip");
    
            ZipInputStream zipInputStream = new ZipInputStream(is);
    
            //开始部署
            Deployment deployment = repositoryService.createDeployment()
                    //添加资源
                   .addZipInputStream(zipInputStream)
                    .name("请假流程审批Zip")
                    .deploy();
            System.out.println("流程部署id:" + deployment.getId());
    
            System.out.println("流程部署名称:" + deployment.getName());
        }
    
    

    9、启动流程实例 增加BusinessKey
    流程都是动态的,什么人请假,找上级审批都不是不固定的,这些动态的内容都是不包含在25张表里面的,我们需要自定义表(比如请假,需要请假内容、请假当事人、开始时间、结束时间等。这些都存放在我们自己自定义的请假表里面)然后在将业务系统和activiti关联。主要是 act_ru_execution 中的BUSINESS_KEY_来和业务表中的主键进行关联

    public class BusinessKeyAdd {
        public static void main(String[] args) {
            //创建ProcessEngine 对象
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
            //得到RuntimeService
            RuntimeService runtimeService = processEngine.getRuntimeService();
    
            //启动流程实例,同时需要制定业务标识(BusinessKey ==请假表中的ID)
            //流程定义本身的key     业务表中的标识
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", "1001");
    
            //输出相关属性
            System.out.println(processInstance.getBusinessKey());
        }
    }
    
    

    在这里插入图片描述
    在这里插入图片描述

    10、全部流程挂起与激活

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
        RepositoryService repositoryService = processEngine.getRepositoryService();
    
        //查询流程实例
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("holiday").singleResult();
    
        //得到当前流程定义的实例是否都为暂停状态
        boolean suspended = processDefinition.isSuspended();
        String processDefinitionId = processDefinition.getId();
        if (suspended) {
            //说明是暂停,就可以使用激活操作
            repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
            System.out.println("流程定义:" + processDefinitionId + "激活");
        } else {
            repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
            System.out.println("流程定义:" + processDefinitionId + "挂起");
        }
    }
    
    

    在这里插入图片描述
    在这里插入图片描述

    流程定义为挂起状态时,该流程定义不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行
    11、单个流程实例挂起与激活
    在这里插入图片描述

    public static void main(String[] args) {
        //创建ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //得到流程实例对象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processDefinitionKey("holiday").singleResult();
    
        //是否挂起
        boolean suspended = processInstance.isSuspended();
    
        String processInstanceId = processInstance.getId();
    
        if (suspended) {
            runtimeService.activateProcessInstanceById(processInstanceId);
            System.out.println("流程 " + processInstanceId + "激活");
        } else {
            runtimeService.suspendProcessInstanceById(processInstanceId);
            System.out.println("流程 " + processInstanceId + "挂起");
        }
    }
    
    

    在这里插入图片描述
    在这里插入图片描述

    在挂起的时候,如果还处理当前实例的任务的时候。会抛出 ActivitiException:Connot complete a suspended task 异常

  • 相关阅读:
    Bitcode设置 编译问题
    NSDate 时间比较...等
    MagicalRecord 多表关联数据操作
    简单的 同步 异步 请求
    pod创建的工程找不到库
    UITableViewCell 自适应高度 ios8特性
    iOS中nil、Nil、NULL、NSNull详解(转)
    c++ wchar_t 与char 直接的转换【转】
    VS 2010 转到COFF期间失败。
    OpenCV中阈值(threshold)函数: threshold 。
  • 原文地址:https://www.cnblogs.com/yangk1996/p/12651244.html
Copyright © 2011-2022 走看看