Activit7之流程设计与流程API基本使用

385 阅读8分钟

Activit7之流程设计与流程API基本使用

Activiti Designer流程设计器

Activiti Designer的安装

访问https://plugins.jetbrains.com/plugin搜索actiBPM插件并下载(或者在符合IDEA的版本中搜索插件名安装),支持IDEA版本为2019.1.4,高版本不支持该插件。

在这里插入图片描述
其他IDEA版本下载地址:https://www.jetbrains.com/idea/download/other.html

Activiti Designer的使用

New-BpmnFile,命令文件名称loan,进入流程设计页面

在这里插入图片描述
绘制流程,指定流程定义key(流程定义的标识)以及流程名称。

在这里插入图片描述

选中任务结点,在左侧视图中指定每个任务结点的负责人
在这里插入图片描述
图形绘制好后,将loan.bpm文件修改为loan.xml,选中loan.xml文件右键Diagrams->Show BPMN 2.0 Designer生成预览图并保存。
在这里插入图片描述

activiti-app的使用

下载与部署

官网: https://www.activiti.org/get-started
在这里插入图片描述
部署: activiti-app.war放置到tomcat的webapps中,启动tomcat即可运行

访问:http://localhost:8080/activiti-app
在这里插入图片描述

功能概述

输入默认的用户名/密码即可登录并制作流程: admin/test
在这里插入图片描述
主界面的三个菜单主要承担以下功能:

Kickstart App

主要用于流程模型管理、表单管理及应用(App)管理,一个应用可以包含多个流程模型,应用可发布给其他用户使用。

Task App

用于管理整个activiti-app的任务,在该功能里面也可以启动流程。

Idenity management

身份信息管理,可以管理用户、用户组等数据。

创建用户

首页点击Identity management,进去之后选择Users标签页,添加一些用户数据。
在这里插入图片描述

创建流程定义

新建流程模型

主界面点击Kickstart App,进入流程模型管理的主界面,点击“Create Process”按钮,弹出新建流程模型界面
在这里插入图片描述
填写流程基本信息
在这里插入图片描述
输入模型信息后,会进入流程模型设计界面
在这里插入图片描述
在这里插入图片描述

结点设置id与名称

为每一个结点设置id与名称
在这里插入图片描述
在这里插入图片描述

分配负责人

为每一个任务结点设置负责人
在这里插入图片描述
选择创建好的用户
在这里插入图片描述

任务执行者可以是单个用户(Assignee),候选用户组 (Candidate Users),候选组(Candidate Groups)
在这里插入图片描述
在这里插入图片描述

设置路由条件

在这里插入图片描述

在这里插入图片描述

导出流程设计

流程设计好后保存
在这里插入图片描述
从设计流程模型列表选择设计项
在这里插入图片描述
进入后下载
在这里插入图片描述

流程的基本使用

相关依赖

<dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>org.activiti.cloud.rb</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>7.1.0.M6</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
        
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

    </dependencies>

引擎配置文件

在classpath下创建activiti.cgf.xml文件,activiti.cfg.xml是activiti的引擎配置文件,包括ProcessEngineConfiguration的定义、数据源定义、事务管理器等

流程引擎的配置类,通过ProcessEngineConfiguration可以创建工作流引擎ProceccEngine,常用两种方法

使用StandaloneProcessEngineConfiguration类

<?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/activiti"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    
    <!--流程引擎的配置类,通过ProcessEngineConfiguration创建工作流引擎ProceccEngine
    
    	activiti单独运行的ProcessEngine配置对象,Activiti会自己处理事务
    	
        定义一个id为processEngineConfiguration的bean,会使用spring的依赖注入来构建引擎
    -->
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--数据源-->
        <property name="dataSource" ref="dataSource"></property>

        <!--   <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
           <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" />
           <property name="jdbcUsername" value="root" />
           <property name="jdbcPassword" value="123456" />-->

        <!--数据表的处理策略-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

atabaseSchemaUpdate参数

false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常

true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建

create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表

drop-create:先删除表再创建表

create: 构建流程引擎时创建数据库表, 关闭流程引擎时不删除这些表

使用SpringProcessEngineConfiguration与Spring整合

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd


http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
    <!-- 工作流引擎配置bean -->
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 使用spring事务管理器 -->
        <property name="transactionManager" ref="transactionManager"/>
        <!-- 数据库策略 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

    <!-- 流程引擎 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>

    <!-- 资源服务service -->
    <bean id="repositoryService" factory-bean="processEngine"
          factory-method="getRepositoryService"/>
    <!-- 流程运行service -->
    <bean id="runtimeService" factory-bean="processEngine"
          factory-method="getRuntimeService"/>
    <!-- 任务管理service -->
    <bean id="taskService" factory-bean="processEngine"
          factory-method="getTaskService"/>
    <!-- 历史管理service -->
    <bean id="historyService" factory-bean="processEngine"
          factory-method="getHistoryService"/>
    <!-- 引擎管理service -->
    <bean id="managementService" factory-bean="processEngine"
          factory-method="getManagementService"/>

    <!-- 数据源 -->
    <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/activiti"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <property name="maxActive" value="3"/>
        <property name="maxIdle" value="1"/>
    </bean>

    <!-- 事务管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>

    <!-- 切面,根据具体项目修改切点配置 -->
    <aop:config proxy-target-class="true">
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.ybzy.demo.service.impl.*.*(..))"/>
    </aop:config>
</beans>

生成数据库表

创建ProcessEngineConfiguration,通过ProcessEngineConfiguration创建ProcessEngine,在创建
ProcessEngine时会自动创建数据库表

一般创建方式

    @Test
    public void test() {
        /**
         * 创建ProcessEngineConfiguration对象
         * 第一个参数:配置文件名称
         * 第二个参数:processEngineConfiguration的bean的id
         */
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");

        // ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration123");

        //创建ProcesEngine对象
        ProcessEngine processEngine = configuration.buildProcessEngine();

		 // 获取各类Service
        RepositoryService repositoryService = processEngine.getRepositoryService();
        TaskService taskService = processEngine.getTaskService();
        RuntimeService runtimeService = processEngine.getRuntimeService();
    }

简单创建方式

    @Test
    public void test() {
        /**
         * 需满足2点强制要求:
         *  activiti配置文件名称:activiti.cfg.xml
         *  bean的id="processEngineConfiguration"
         */
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
		 // 获取各类Service
        RepositoryService repositoryService = processEngine.getRepositoryService();
        TaskService taskService = processEngine.getTaskService();
        RuntimeService runtimeService = processEngine.getRuntimeService();
    }

自动生成25张表
在这里插入图片描述

表的命名

表都以act_开头,第二部分的两个字母标识表示表的用途, 用途也和服务的API对应。

act_re_*:  re表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)

act_ru_*:  ru表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快

act_hi_*:  hi表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等

act_ge_*:  ge表示 general。通用数据, 用于不同场景下

Service

通过ProcessEngine创建 Service,Service 是工作流引擎提供用于进行工作流部署、执行、管理的服
务接口。

service名称service说明
RepositoryServiceactiviti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。
RuntimeServiceactiviti的流程运行管理类,可以从这个服务类中获取很多关于流程执行相关的信息
TaskServiceactiviti的任务管理类,可以从这个类中获取任务的信息。
HistoryServiceactiviti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据,这个服务主要通过查询功能来获得这些数据。
ManagerServiceactiviti的引擎管理类,提供对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti 系统的日常维护

部署流程定义

通过调用activiti的api将流程定义的bpmn和png两个文件添加部署到activiti中,或者将两个文件打zip包进行部署。

单个文件部署方式

    public static void main(String[] args) {
        //创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

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

		// 将指定的bpm文件和图片文件保存在activiti数据库
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("loan.bpmn")
                .addClasspathResource("loan.png")
                .name("借款申请流程")
                .deploy();

        //输出部署信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }

压缩包部署方式

将loan.bpmn与loan.png压缩命名为loanBPMN.zip

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //转化出ZipInputStream流对象
        InputStream is = ActivitiDeployment.class.getClassLoader().getResourceAsStream("loanBPMN.zip");

        //将inputstream流转化为ZipInputStream流
        ZipInputStream zipInputStream = new ZipInputStream(is);

        //部署
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .name("借款申请流程")
                .deploy();

        //输出部署信息
        System.out.println(deployment.getName()); // 借款申请流程
        System.out.println(deployment.getId()); // 1
    }

涉及的表

act_re_deployment  流程定义部署表,记录流程部署信息
	  
act_re_procdef     流程定义表,记录流程定义信息
	 
act_ge_bytearray   资源表,定义的bpmn文件及png文件

act_re_deployment 和 act_re_procdef 一对多关系,一次部署在流程部署表生成一条记录,但一次部署
可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_bytearray会存在两个资源记录,bpmn 和 png。

建议:一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定
义信息。

启动流程实例

流程定义部署后就可以通过工作流管理业务流程了,即部署的借款申请流程可以使用了。启动一个流程表示发起一个新的借款申请流程,可重复多次发起。

public static void main(String[] args) {
        //得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //创建流程实例,根据流程定义key启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("loan");

        //输出实例的相关信息
        System.out.println("流程部署ID:" + processInstance.getDeploymentId()); // null
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId()); // loan:1:4
        System.out.println("流程实例ID:" + processInstance.getId()); // 2501
        System.out.println("活动ID:" + processInstance.getActivityId()); // null
    }

涉及表:

 act_hi_actinst     已完成的活动信息
 act_hi_identitylink   参与者信息
 act_hi_procinst   流程实例
 act_hi_taskinst   任务实例
 act_ru_execution   执行表
 act_ru_identitylink   参与者信息
 act_ru_task  任务

任务查询-负责人user1

流程启动后,各各任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户
的待办任务。

public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        TaskService taskService = processEngine.getTaskService();

        //根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("loan")
                .taskAssignee("user1")
                .list();
                //.singleResult();

        //任务列表的展示
        for (Task task : taskList) {
            System.out.println("流程实例ID:" + task.getProcessInstanceId()); // 2501
            System.out.println("任务ID:" + task.getId()); // 2505
            System.out.println("任务负责人:" + task.getAssignee()); // user1
            System.out.println("任务名称:" + task.getName()); // 填写表单信息
        }
    }

任务处理

任务负责人查询待办任务,选择任务进行处理,完成任务。

  public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();

        //任务id
        String taskId = "2505";
        //处理任务,结合当前用户任务列表的查询操作
        taskService.complete(taskId);
        System.out.println("完成任务id: " + taskId);
    }

涉及表:

act_hi_actinst
act_hi_identitylink
act_hi_taskinst
act_ru_identitylink
act_ru_task

任务查询-负责人user2

负责人user1进行任务处理后,查询负责人user2的任务

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        TaskService taskService = processEngine.getTaskService();

        //根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("loan")
                .taskAssignee("user2")
                .singleResult();

        System.out.println("流程实例ID:" + task.getProcessInstanceId());
        System.out.println("任务ID:" + task.getId());
        System.out.println("任务负责人:" + task.getAssignee());
        System.out.println("任务名称:" + task.getName());
    }
流程实例ID:2501
任务ID:5002
任务负责人:user2
任务名称:项目经理