工作流学习日志-(Activiti7基础-概念、基本api使用)

工作流学习日志-(Activiti7基础-概念、基本api使用)

前言

开发OA人力资源管理系统时在人员调动时、请假审批等需要使用到工作流,以此作为学习契机。
工作流学习日志(Activiti7基础-概念、基本api使用)
工作流学习日志 -(Activiti7进阶)
工作流学习日志-(Activiti7与spring、SpringBoot整合)


一、工作流是什么?

1. 概念

工作流(Workflow),通过计算机对业务流程自动化执行管理。主要解决“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个的业务目标,或者促使此目标的实现。”

2. 实际开发中的具体使用

  1. 关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等
  2. 行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日期周报等凡是原来手工流转处理的行政表单
  3. 人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等
  4. 财务相关类:付款请求、应付款处理、日常报销处理、出差报销、预算和计划申请等
  5. 客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等
  6. 特殊服务类:ISO系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。

3. 实现方式

  • 不使用工作流之前,为了实现流程控制,通常采用状态字段的值来进行跟踪流程的变化情况。这样不同角色的用户,通过状态字段的取值来决定记录是否显示。
  • 针对有权限可以查看的记录,当前用户根据自己的角色来决定审批是否合格的操作。如果合格那么僵状态字段设置一个值用来表示合格;如果不合格也设置一个值对应表示。
  • 这是一种最为原始的方式。通过状态字段虽然可以做到流程控制,但是当我们的流程发生变更的时候,该方式所编写的代码也需要进行调整。
  • 所以就使用专业的方式实现工作流的管理,并且在可以做到业务流程变化之后,我们的程序可以不用进行更改。这时候就需要使用到工作流系统,这可以让我们业务系统的适应能力得到极大提升。

二、Activiti7概述

1. 介绍

Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动。jbpm是一个非常有名的工作流引擎,而Activiti也是一个工作流引擎。activiti可以将业务系统中复杂的业务抽取出来,使用专门的建模语音BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由activit进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
Activiti官网:https://www.activiti.org/

2. BPM

BPM(Business Process Management),即业务流程管理,是一种规范化的构造端到端的业务流程,以持续的提高组织业务效率,常见的商业管理教育如EMBA、MBA等均将BPM包含在内。

3. BPM软件

BPM软件就是根据企业中业务环境的变化,推进人与人之间,人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具。

通过BPM软件对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,使企业成本降低,利润大步提升。

BPM软件在企业中应用领域广泛,凡是有业务流程的地方都可以BPM软件进行管理,比如企业人事办公管理、采购流程管理、公文审批流程管理、财务管理等。

4. BPMN

BPMN(Business Process Model AndNotation)- 业务流程模型和符号 是由BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。
代码如下(示例):

三. Activiti7的使用

1. 开发准备

  • jdk1.8
  • MySQL5.5
  • idea
  • tomcat8.5
  • maven

2. 流程设计器下载

  • 可以直接在IDEA的plugins中搜索actiBPM进行安装
  • 如果在plugins中搜索不出结果。可以在IDEA插件市场:https://plugins.jetbrains.com进行搜索下载,然后在plugins中进行离线安装

3. 创建activiti数据库

CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;

4. 使用Activiti7创建出需要的数据库表

创建准备

  1. 创建一个maven基础项目
  2. 添加Activiti7需要的相关maven依赖(这里使用的是测试版本,后续可以进行更换为稳定版本)
<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>
    </dependencies>
  1. log4j.properties配置
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:\\javaAPI\\study\\activiti7\\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
  1. Activiti7需要的activiti.cfg.xml(文件名称必须一致,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 -->
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 配置数据库相关的信息 -->
        <!--数据库驱动-->
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <!--数据库连接  可简写"jdbc:mysql:///activiti"-->
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
        <!--数据库用户名-->
        <property name="jdbcUsername" value="root"/>
        <!--数据库密码-->
        <property name="jdbcPassword" value="root"/>
        <!--activiti数据库表在生成时的策略  true->如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会进行创建。-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
  1. 使用Activiti7提供的工具类创建出需要的数据库表
/**
     * 使用activiti提供的默认方式来创建MySQL的表
     */
    @Test
    public void testCreateDbTable(){
        //需要使用activiti提供的工具类ProcessEngines,使用其提供的方法getDefaultProcessEngine。
        //getDefaultProcessEngine会默认从resources下读取名字 activiti.cfg.xml(所以创建该文件时名字不能出错)文件
        //创建processEngine时,就会创建MySQL表
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(processEngine);
    }

activiti表结构介绍

  • 创建出来的数据库表都是以ACT_开头,方便识别。总共创建了25张表。
  • 第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。 ACT_RE :'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。 ACT_RU:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_HI:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。 ACT_GE : GE 表示 general。 通用数据, 用于不同场景。
表分类表名解释
一般数据
[ACT_GE_BYTEARRAY]通用的流程定义和流程资源
[ACT_GE_PROPERTY]系统相关属性
流程历史记录
[ACT_HI_ACTINST]历史的流程实例
[ACT_HI_ATTACHMENT]历史的流程附件
[ACT_HI_COMMENT]历史的说明性信息
[ACT_HI_DETAIL]历史的流程运行中的细节信息
[ACT_HI_IDENTITYLINK]历史的流程运行过程中用户关系
[ACT_HI_PROCINST]历史的流程实例
[ACT_HI_TASKINST]历史的任务实例
[ACT_HI_VARINST]历史的流程运行中的变量信息
流程定义表
[ACT_RE_DEPLOYMENT]部署单元信息
[ACT_RE_MODEL]模型信息
[ACT_RE_PROCDEF]已部署的流程定义
运行实例表
[ACT_RU_EVENT_SUBSCR]运行时事件
[ACT_RU_EXECUTION]运行时流程执行实例
[ACT_RU_IDENTITYLINK]运行时用户关系信息,存储任务节点与参与者的相关信息
[ACT_RU_JOB]运行时作业
[ACT_RU_TASK]运行时任务
[ACT_RU_VARIABLE]运行时变量表

5. Activiti关系

流程引擎配置类

主要类如下:
在这里插入图片描述

1. StandaloneProcessEngineConfiguration

使用StandaloneProcessEngineConfigurationActiviti可以单独运行,来创建ProcessEngine,Activiti会自己处理事务。

通常在activiti.cfg.xml配置文件中定义一个id为 processEngineConfiguration 的bean.

    <!-- 在默认方式下,bean的id固定processEngineConfiguration -->
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 配置数据库相关的信息 -->
        <!--数据库驱动-->
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <!--数据库连接  可简写"jdbc:mysql:///activiti"-->
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
        <!--数据库用户名-->
        <property name="jdbcUsername" value="root"/>
        <!--数据库密码-->
        <property name="jdbcPassword" value="root"/>
        <!--activiti数据库表在生成时的策略  true->如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会进行创建。-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

也可以使用连接池的方式进行创建:

<!--使用dbcp连接池的方式进行创建-->
    <bean id="dataSources" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <!--数据库连接  可简写"jdbc:mysql:///activiti"-->
        <property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
        <!--数据库用户名-->
        <property name="username" value="root"/>
        <!--数据库密码-->
        <property name="password" value="root"/>
        <!--dbcp特有的配置-->
        <property name="maxActive" value="3"/>
        <property name="maxIdle" value="1"/>
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--引用连接池的方式来进行配置-->
        <property name="dataSource" ref="dataSources"/>
        <!--activiti数据库表在生成时的策略  true->如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会进行创建。-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
2. SpringProcessEngineConfiguration

工作引擎创建方式

  1. 使用默认的方式进行创建
//---------------------默认方式进行配置processEngine
//需要使用activiti提供的工具类ProcessEngines,使用其提供的方法getDefaultProcessEngine。
 //getDefaultProcessEngine会默认从resources下读取名字 activiti.cfg.xml(所以创建该文件时名字不能出错)文件
 //创建processEngine时,就会创建MySQL表
 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 RepositoryService repositoryService = processEngine.getRepositoryService();
 repositoryService.createDeployment();
  1. 自定义方式进行创建
//--------------------使用自定义的方式创建processEngine
//配置文件的名字可以自定义。   bean中的id也可以自定义
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration
        .createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");
//获取流程引擎对象
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();

Servcie服务接口

  • 流程引擎类可以进行操作的service如下:(老版本如:Activiti6中的IdentityService,FormService两个service在7中已经废除)
    在这里插入图片描述
    service接口
service名称service作用
RepositoryServiceactiviti的资源管理类
RuntimeServiceactiviti的流程运行管理类
TaskServiceactiviti的任务管理类
HistoryServiceactiviti的历史管理类
ManagerServiceactiviti的引擎管理类

常用接口介绍

  • RepositoryService
    • 是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
    • 除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
    • 暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
    • 获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
  • RuntimeService
    • Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
  • TaskService
    • Activiti的任务管理类。可以从这个类中获取任务的信息。
  • HistoryService
    • Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
  • ManagementService
    • Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。

6. ActiBPM插件的使用

1. 设置工作流程图

使用该插件可以很方便的设计工作流程,是一个bpmn文件,底层是一个xml文件,该插件就是图形化展示工作流程的xml文件。方便开发人员的设计。

新建一个bpmn文件时如图:一般的bpmn文件一定要设置画布的id(在数据库作为key存在),以及那么设置为整个工作的流程名称
在这里插入图片描述
设置工作流程图中的任务
在这里插入图片描述

2. 将流程图导出为png图片

  1. 将创建好的bpmn文件设置为xml文件格式
  2. 在xml文件页右键单击生成流程图形
    在这里插入图片描述
  3. 使用导出功能获取png文件
    在这里插入图片描述
  4. 将获取到的png文件存放在resource中bpmn存放的文件夹中。
  5. 最后将xml文件重命名为bpmn文件。

7. Activiti7基本使用

1. 流程部署

  1. 使用流程设计器,使用流程符号,画出流程图
    • 得到bpmn文件、png文件
    • 都是流程资源文件,用来描述流程,流程中需要的节点,节点的负责人
    • 出差申请流程,请假申请流程、报销申请流程
  2. 把流程的资源文件,进行部署
    • 上传到数据库中,使用java代码进行流程部署
    • 一次部署操作:
      • ACT_RE_DEPLOYMENT 会生成一条记录
      • ACT_RE_PROCDEF生成流程定义信息
  3. deployment和procdef表 一对多的关系
    • 在procdef表中可以有多条记录,每条记录对应一个流程的定义信息

代码如下:

//得到processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//获得repositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();

//使用repositoryService进行部署
Deployment deployment = repositoryService.createDeployment()
        .addClasspathResource("bpmn/businessTrip.bpmn")
        .addClasspathResource("bpmn/businessTrip.png")
        .name("出差申请流程")
        .deploy();

//输出部署的信息
System.out.println("部署的id="+deployment.getId());
System.out.println("部署的名称=="+deployment.getName());

使用zip文件的方式部署:

//1.获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//2.获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();

//获取到zip的输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/businessTrip.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);

//3.使用repositoryService中的方法进行部署,使用zip的文件。使用压缩包的方式,一般不设置名称。
Deployment deploy = repositoryService.createDeployment()
        .addZipInputStream(zipInputStream)
        .deploy();

System.out.println("流程部署id="+deploy.getId());
System.out.println("流程部署名称name="+deploy.getName());

2. 流程启动

//获取到processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取到RuntimeService实例
RuntimeService runtimeService = processEngine.getRuntimeService();
//使用RuntimeService中的方法进行启动流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myBusinessTrip");

//输出内容
System.out.println("流程定义ID="+instance.getProcessDefinitionId());
System.out.println("流程实例ID="+instance.getId());
System.out.println("当前活动ID="+instance.getActivityId());

流程启动之后会对数据库中以下表进行增加修改:

  • act_hi_actinst 流程实例执行历史
  • act_hi_identitylink 流程的参与用户历史信息
  • act_hi_procinst 流程实例历史信息
  • act_hi_taskinst 流程任务历史信息
  • act_ru_execution 流程执行信息
  • act_ru_identitylink 流程的参与用户信息
  • act_ru_task 任务信息

3. 查询个人任务列表

//选择负责人
String assignee = "zhangsan";

//获取到processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//获取到taskService
TaskService taskService = processEngine.getTaskService();

//使用TaskService根据流程的key和任务负责人查询任务
List<Task> list = taskService.createTaskQuery()
        .processDefinitionKey("myBusinessTrip")//流程的key
        .taskAssignee(assignee)//查询该负责人的任务
        .list();

//遍历获取任务内容
for (Task task : list) {
    System.out.println("流程实例:"+task.getProcessInstanceId());
    System.out.println("任务id:"+task.getId());
    System.out.println("任务负责人:"+task.getAssignee());
    System.out.println("任务名称:"+task.getName());
}

4. 执行选中的任务

String assignee = "zhaoliu";

//1.创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//2.获取到TaskService
TaskService taskService = processEngine.getTaskService();

//3.使用TaskService中的方法(使用任务id)完成任务
//        taskService.complete("2505");

//4.根据流程的key以及负责人名称获取对应的任务id,动态进行完成任务
Task task = taskService.createTaskQuery()
        .processDefinitionKey("myBusinessTrip")//流程的key
        .taskAssignee(assignee)//任务负责人名称
        .singleResult();//获取单个task任务

System.out.println("任务的id="+task.getProcessDefinitionId());
System.out.println("任务id="+task.getId());
System.out.println("任务的名称="+task.getName());
System.out.println("任务的负责人="+task.getAssignee());

//5.动态获取任务id完成任务
taskService.complete(task.getId());

执行过程中涉及到的表:

  • ACT_HI_TASKINST
  • ACT_HI_ACTINST
  • ACT_HI_IDENTITYLINK
  • ACT_RU_TASK
  • ACT_RU_IDENTITYLINK
  • ACT_HI_TAASKINST
  • ACT_HI_EXECUTION
  • ACT_HI_ACTINST
  • ACT_RU_TASK

5. 查看流程定义查询

//1.获取引擎processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//2.获取到repositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();

//3.使用RepositoryService中的方法查询流程定义
List<ProcessDefinition> myBusinessTrip = repositoryService
        .createProcessDefinitionQuery()//创建流程定义查询
        .processDefinitionKey("myBusinessTrip")//根据key获取流程定义
        .orderByProcessDefinitionVersion()//根据数据库act_re_procdef(流程定义数据库)中的version版本进行排序
        .desc()//倒序排序
        .list();//将流程定义查询的结果使用list进行封装

//遍历输出信息
for (ProcessDefinition processDefinition : myBusinessTrip) {
    System.out.println("流程定义ID="+processDefinition.getId());
    System.out.println("流程定义名称="+processDefinition.getName());
    System.out.println("流程定义key="+processDefinition.getKey());
    System.out.println("流程定义版本="+processDefinition.getVersion());
}

6. 流程删除

  • 删除流程部署信息
    • 可以说是删除了部署操作后的数据库中内容act_ge_bytearray/act_re_deployment/act_re_procdef
    • 当流程开启的时候,不能使用repositoryService.deleteDeployment(deploymentId);直接进行删除
    • 必须使用repositoryService.deleteDeployment(deploymentId,true);方法可以进行级联删除删除启动中的流程
//1.获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//2.获取到repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();

//3.使用repositoryService获取到删除开发信息
String deploymentId = "1";//例如我们要删除部署id为1的流程部署信息
//        repositoryService.deleteDeployment(deploymentId);
repositoryService.deleteDeployment(deploymentId,true);

7. 获取流程部署资源文件

  • 下载数据库act_ge_bytearray中的二进制部署文件
    • 方法一:
      • 使用activiti提供的api(repositoryService)进行操作下载资源文件,保存到文件目录
    • 方法二:
      • 自己写代码从数据库中下载文件,使用jdbc对blob类型,blob类型数据读取出来,保存到文件目录
    • 解决IO操作:Commons-io.jar
//1.获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//2.获取到RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();

//3.获取流程定义查询对象ProcessDefinitionQuery,查询流程定义信息
String processDefinitionKey = "myBusinessTrip";
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
        .processDefinitionKey(processDefinitionKey)
        .singleResult();

//4.通过流程定义信息,获取部署ID
String deploymentId = processDefinition.getDeploymentId();

//5.通过RepositoryService,传递部署id参数,读取到资源的信息(bpmn、png)
//5.1使用ProcessDefinitionQuery查询出对应的bpmn文件和png文件的名字
String pngName = processDefinition.getDiagramResourceName();
String bpmnName = processDefinition.getResourceName();
//5.2获取到png、bpmn文件的输入流
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pngName);
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, bpmnName);

//6.构造outputStream
File pngFile = new File("D:\\study\\Activiti7place\\businessTrip.png");
File bpmnFile = new File("D:\\study\\Activiti7place\\businessTrip.bpmn");
FileOutputStream pngOutput = null;
FileOutputStream bpmnOutput = null;
try {
    pngOutput = new FileOutputStream(pngFile);
    bpmnOutput = new FileOutputStream(bpmnFile);
    //7.使用inputStream和输出流进行转换
    IOUtils.copy(pngInput,pngOutput);
    IOUtils.copy(bpmnInput,bpmnOutput);
    //8.关闭流
    bpmnOutput.close();
    pngOutput.close();
    bpmnInput.close();
    bpmnInput.close();
} catch (IOException e) {
    e.printStackTrace();
}

8. 查询历史消息

主要查询数据库act_hi_actinst中的记录

//1.获取到processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

//2.获取到historyService
HistoryService historyService = processEngine.getHistoryService();

//3.获取HistoricActivityInstanceQuery历史活动实例查询
HistoricActivityInstanceQuery processInstanceQuery = historyService.createHistoricActivityInstanceQuery();

//4.使用HistoricProcessInstanceQuery的方法进行查询数据库act_hi_actinst中数据,可以根据processDefinitionId/processInstanceId查询
List<HistoricActivityInstance> list = processInstanceQuery
//                .processDefinitionId("myBusinessTrip:1:5004")
        .processInstanceId("7501")
        .orderByActivityId()
        .asc()
        .list();

//5.遍历获取内容
for (HistoricActivityInstance historicActivityInstance : list) {
    System.out.println("========================================");
    System.out.println("活动id="+historicActivityInstance.getActivityId());
    System.out.println("活动的名称="+historicActivityInstance.getActivityName());
    System.out.println("任务负责人="+historicActivityInstance.getAssignee());
    System.out.println("流程定义id="+historicActivityInstance.getProcessDefinitionId());
    System.out.println("流程实例ID="+historicActivityInstance.getProcessInstanceId());
}

总结

在这里工作流Activiti7的基本使用算是了解了。接下来还需要将Activiti7与工作业务进行一个集成。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值