activiti 学习之入门案例

目录

引入依赖

 创建activiti.cfg.xml配置文件(名字固定)

构建activit相关的数据表

        方式一:

        方式二: 

表结构

        通用的数据表(ACT_GE_)2张

        流程历史记录(ACT_HI_) 8张

        流程定义表 (ACT_RE_)3张

        运行实例表 (ACT_RU_)6张

其它2张

流程符号简介

        事件Event

         活动activity

         网关AateWay

        流向 Flow

工作流引擎

Service总览

入门实验

        部署

        流程定义查询 

         删除部署

        启动

        任务查询

        任务完成 

        下载资源

         查询历史信息

        绑定业务key

         挂起与激活


引入依赖

 创建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">
        <!--    这个bean的id是不可改的-->
    <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://101.35.118.177:3306/study-activiti"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="Citi@2014"/>
        <!-- activiti 数据库在生成的时候 ture 如果数据库中存在响应的表,则直接使用,不重新生成 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

</beans>

构建activit相关的数据表

        方式一:

package com.any.utils;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;

public class CreateActivitiSchema {
    /**
     * 使用activiti 提供的默认方式来创建mysql的表
     * @throws
     * @update 2021-11-15 15:59 by 15821
     */
    public static void main(String[] args) {
        // 需要使用processEngine 提供的工具类processEngine,使用方法getDefaultProcessEngine()\
        // 使用方法getDefaultProcessEngine 方法就从Activiti.cfg.xml中获取所定义得信息
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(processEngine);
    }
}

        方式二: 

package com.any.utils;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;

public class CreateActivitiSchema {
    /**
     * 根据自定义的xml和bean名称进行创建数据表
     * @throws
     * @update 2021-11-15 15:59 by 15821
     */
    public static void main(String[] args) {
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml","processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        System.out.println(processEngine);

    }
}

表结构

        通用的数据表(ACT_GE_)2张

表名描述
ACT_GE_BYTEARRAY通用的流程定义和流程资源
ACT_GE_PROPERTY系统相关属性

        流程历史记录(ACT_HI_) 8张

表名描述
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_)3张

表名描述
ACT_RE_DEPLOYMENT部署单元信息
ACT_RE_MODEL模型信息
ACT_RE_PROCDEF已部署的流程定义

        运行实例表 (ACT_RU_)6张

表名描述
ACT_RU_DEADLETTER_JOB
ACT_RU_EVENT_SUBSCR运行时事件
ACT_RU_EXECUTION运行时流程执行实例
ACT_RU_IDENTITYLINK运行时用户关系信息,存储任务节点与参与者的相关信息
ACT_RU_INTEGRATION
ACT_RU_JOB运行时作业
ACT_RU_SUSPENDED_JOB
ACT_RU_TASK运行时任务
ACT_RU_TIMER_JOB
ACT_RU_VARIABLE运行时变量表

其它2张

表名描述
ACT_EVT_LOG事件日志
ACT_PROCDEF_INFO流程定义的动态变更信息

流程符号简介

        BPMN2.0 是业务流程建模符号2.0 的缩写

        事件Event

         活动activity

        活动是工作和任务的一个通用术语。一个活动可以是一个任务,也可以是一个子任务的处理流程

         网关AateWay

        网管用于处理决策,常用的网关

         排他网关(X)

                - 只有一条路径会被选择,流程执行到该网关时,按照输出流的顺序逐个计算,当条件计算结果为true时,继续执行当前网

                - 如果多条线路同时执行的结果都是true,则会执行第一个值为true的路线,如果所有路线都不是true时,则引擎会抛出异常

                - 排他网关需要和条件顺序结合使用,default属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流

        并行网关(+)

                所有路线都会被同时选择

                - 拆分——并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。

                - 合并——所有从并行网关拆分并执行完成的路线均在此等候,知道所有的线路都执行完成才继续向下执行

        包容网关

                可以同时执行多条线路,也可以在网关上设置条件

                - 拆分——计算每条路线上的表达式,当表达式计算为true时,创建一个并行线路并继续执行

                - 合并—— 所有从并行网关拆分并执行完成的路线均在此等候,知道所有的线路都执行完成才继续向下执行

        事件网关

                专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。

        流向 Flow

        流向是连接两个流程节点的连线,常见的流向包括一下几种:

                后面补充

工作流引擎

        ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。 

Service总览

        可以通过工作引擎(ProcessEngine)获取所有的service

Service名称描述
RepositoryServiceActiviti的资源管理类
RuntimeServiceActiviti的流程运行管理类
TaskServiceActiviti的任务管理类
HistoryServiceactiviti的历史管理类
ManagerServiceactiviti的引擎管理类

入门实验

        部署

        通过ProcessEngin获取RepositoryService,部署牵扯到的表操作(ACT_GE_BYTEARRAY 资源表、ACT_RE_DEPLOYMENT 部署表、ACT_RE_PROCDEF 流程定义表)

/**
 * 部署流程
 * @update 2021-11-16 17:22 by 15821
 */
public void testDeployment() {
        //1. 创建 processsEngine
    ProcessEngineConfiguration configuration =
            ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                    "activiti.cfg.xml","processEngineConfiguration");
    ProcessEngine processEngine = configuration.buildProcessEngine();
    //2. 获取repositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //3. 使用service进行流程部署
    Deployment deployment = repositoryService.createDeployment()
            .name("创建出差流程")
            .addClasspathResource("bpmn/evection.bpmn20.xml")
            .deploy();
    System.out.println(deployment.getId());
    System.out.println(deployment.getName());
}

        流程定义查询 

    /**
     * 流程定义查询
     * @update 2021-11-17 08:48 by 15821
     */
    public void testQueryProcessDefinition() {
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .orderByProcessDefinitionVersion()
                .desc()
                .list();
        for (ProcessDefinition processDefinition : processDefinitions) {
            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());
        }

    }

         删除部署

    /**
     * 删除部署
     * @update 2021-11-17 09:08 by 15821
     */
    public void testDeleteDeployment() {
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        String deploymentId = "1";
        repositoryService.deleteDeployment(deploymentId);
    }

        启动

        通过ProcessEngin获取RuntimeService根据流程定义的key进行启动

        操作表

                - ACT_HI_ACTINST                流程实例执行历史
                - ACT_HI_IDENTITYLINK       流程参与用户的历史信息
                - ACT_HI_PROCINST             流程实例的历史信息
                - ACT_HI_TASKINST              流程任务的历史信息
                - ACT_RU_EXECUTION         流程执行信息
                - ACT_RU_IDENTITYLINK      流程的正在参与用户信息
                - ACT_RU_TASK                     流程当前任务xi

    /**
     * 启动流程
     * @update 2021-11-16 17:22 by 15821
     */
    public void testStartProcess(){
        //1. 创建 processsEngine
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml","processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance myEvection = runtimeService.startProcessInstanceByKey("myEvection");
        System.out.println("流程定义ID:"+myEvection.getProcessDefinitionId());
        System.out.println("流程实例ID:"+myEvection.getId());
        System.out.println("当前活动ID:"+myEvection.getActivityId());
    }

        任务查询

        通过ProcessEngin获取TaskService根据流程定义的key和负责人名称进行查询

    /**
     * 查询个人任务
     * @update 2021-11-16 17:56 by 15821
     */

    public void testFindPersonalTaskList(){
        //1. 创建 processsEngine
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml","processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myEvection")
                .taskAssignee("rose")
                .list();
    }

        任务完成 

         通过ProcessEngin获取TaskService根据任务id进行完成

    /**
     * 完成当前的个人任务
     * @update 2021-11-16 18:19 by 15821
     */
    public void testFinshPersonalTask(){
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml","processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        taskService.complete("10002");
    }

        下载资源

    /**
     * 下载资源文件
     * @update 2021-11-17 09:22 by 15821
     */
    public void downloadDeployment() throws IOException {
//        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
//        2.获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3.获取ProcessDefinition,查询流程定义信息
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .singleResult();
//        4.获取流程定义信息获取部署id
        String deploymentId = processDefinition.getDeploymentId();
        String resourceName = processDefinition.getResourceName();
//        5.通过RepositoryService,传递部署id参数,读取资源信息
        InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
//        6.构造outputStream流
        File XmlFile = new File("D:/coding-project/test-download/evection.bpmn20.xml");
        FileOutputStream outputStream = new FileOutputStream(XmlFile);
//        7.输入流输出流的转换
        IOUtils.copy(resourceAsStream, outputStream);
//        8.关闭流
        outputStream.close();
        resourceAsStream.close();
    }

         查询历史信息

    /**
     * 查询历史信息
     * @update 2021-11-18 16:46 by 15821
     */
    public void testFindHistoryInfo() {
//        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
//        2.获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
//        3. 获取actinst表的数据
        HistoricActivityInstanceQuery activityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
//        4.添加查询条件
        activityInstanceQuery.taskAssignee("zhangsan");
//        5.排序
        activityInstanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//        6.获取结果
        List<HistoricActivityInstance> activityInstances = activityInstanceQuery.list();
//        7.测试输出
        for (HistoricActivityInstance activityInstance : activityInstances) {
            System.out.println(activityInstance.getActivityId());
            System.out.println(activityInstance.getActivityName());
            System.out.println(activityInstance.getProcessInstanceId());
            System.out.println(activityInstance.getProcessDefinitionId());
            System.out.println(
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                            .format(activityInstance.getStartTime()));
            System.out.println("----------------------------------------------------");
        }
    }

        绑定业务key

    /**
     * 添加业务的key 到activiti 表中  (ACT_RU_EXECUTION)
     *
     * @update 2021-11-18 18:35 by 15821
     */
    @Test
    public void addBusinessKey() {
        //        1.获取引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
//        2.获取runtimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance instance = runtimeService
                .startProcessInstanceByKey("myEvection", "1001");
        System.out.println(instance.getBusinessKey());
    }

         挂起与激活

根据流程定义来挂起(激活)

    /**
     * 全部流程实例的挂起和激活
     *
     * @update 2021-11-18 18:57 by 15821
     */
    @Test
    public void suspendAllProcessInstance() {
//        1、获取流程引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
//        2.获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3.查询流程定义
        ProcessDefinition definition = repositoryService
                .createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .singleResult();
//        4.判断当前的流程定义的实例是否都是挂起状态
        boolean suspended = definition.isSuspended();
//        5.如果是挂起则激活
        if (suspended) {  // true 挂起
            // 如果是挂起,则激活,
            // activateProcessDefinitionById(流程定义Id,是否激活,激活时间)
            repositoryService.activateProcessDefinitionById(
                    definition.getId(),
                    true,
                    null);
            System.out.println("流程定义ID:" + definition.getId() + "已激活");
        }else{
//            6.如果是激活则挂起
            // suspendProcessDefinitionById(流程定义Id,是否挂起,激活时间)
            repositoryService.suspendProcessDefinitionById(definition.getId(),
                    true,
                    null);
            System.out.println("流程定义ID:" + definition.getId() + "已挂起");
        }
    }

挂起或激活单个流程实例

    /**
     * 挂起或激活单个流程实例
     * @update 2021-11-18 20:05 by 15821
     */
    @Test
    public void suspendSingleProcessInstance(){
//        1、获取流程引擎
        ProcessEngineConfiguration configuration =
                ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                        "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine processEngine = configuration.buildProcessEngine();
//        2.获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
                .processInstanceId("17501")
                .singleResult();
        boolean suspended = instance.isSuspended();

        if(suspended){
//            如果是挂起,则激活,
            // activateProcessDefinitionById(流程定义Id,是否挂起,激活时间)
            runtimeService.activateProcessInstanceById(instance.getId());
            System.out.println("流程实例ID:"+instance.getId()+"已经激活");
        }else{
//            如果是激活则挂起
            // suspendProcessDefinitionById(流程定义Id,是否挂起,激活时间)
            runtimeService.suspendProcessInstanceById(instance.getId());
            System.out.println("流程实例ID:"+instance.getId()+"已经挂起");
        }

    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪家李子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值