• Activiti 学习(四)—— Activiti 结合实际业务



    流程实例

    流程实例(ProcessInstance)代表流程定义的执行实例。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。例如:用户或程序按照流程定义内容发起一个流程,这就是一个流程实例

    流程定义和流程实例的图解:


    启动流程实例并添加 BusinessKey(业务标识)

    流程定义部署在 activiti 后,就可以在系统中通过 activiti 去管理该流程的执行,执行流程表示流程的一次执行

    比如部署系统出差流程后,如果某用户要申请出差这时就需要执行这个流程,如果另外一个用户也要申请出差则也需要执行该流程,每个执行互不影响,每个执行是单独的流程实例

    启动流程实例时,指定的 businesskey,就会在 act_ru_execution 流程实例的执行表中存储businesskey

    Businesskey,业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据

    比如:出差流程启动一个流程实例,就可以将出差单的 id 作为业务标识存储到 activiti 中,将来查询 activiti 的流程实例信息就可以获取出差单的 id 从而关联查询业务系统数据库得到出差单信息

    /**
     * 添加业务 key 到 Activiti 的表
     */
    @Test
    public void addBusinessKey() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 3. 启动流程,添加 BusinessKey
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("evection", "1001");
        // 4. 输出
        System.out.println("businessKey: " + instance.getBusinessKey());
    }
    

    流程定义的其他操作

    1. 流程定义查询

    查询流程相关信息,包含流程定义,流程部署,流程定义版本

    public void queryProcessDefinition() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 查询当前所有的流程定义,返回流程定义信息的集合
        ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
        List<ProcessDefinition> definitions = definitionQuery.processDefinitionKey("evection")
            .orderByProcessDefinitionVersion()  // 进行排序
            .desc() // 倒序
            .list();
        // 4. 输出信息
        for (ProcessDefinition definition : definitions) {
            System.out.println("流程定义 id = " + definition.getId());
            System.out.println("流程定义名称 = " + definition.getName());
            System.out.println("流程定义 key = " + definition.getKey());
            System.out.println("流程定义版本 = " + definition.getVersion());
        }
    }
    

    2. 流程定义删除

    public void deleteDeployment() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 通过部署 id 删除流程部署信息,如果该流程定义已有流程实例启动则删除时出错
        String deploymentId = "2501";
        repositoryService.deleteDeployment(deploymentId);
        // 设置 true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置 false 非级别删除方式
        // repositoryService.deleteDeployment(deploymentId, true);
    }
    

    3. 流程资源下载

    我们把流程资源文件上传到数据库,如果其他用户想要查看这些资源文件,可以从数据库下载资源文件

    /**
         * 下载资源文件,使用 Activiti 提供的 api 下载资源文件,保存到文件目录
         */
    public void getDeployment() throws IOException {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 获取查询对象 ProcessDefinitionQuery,查询流程定义信息
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
            .processDefinitionKey("evection")
            .singleResult();
        // 4. 通过流程定义信息,获取部署 id
        String deploymentId = processDefinition.getDeploymentId();
        // 5. 通过 RepositoryService,传递部署 id 参数,读取资源信息
        InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
        // 6. 保存资源文件
        File file = new File("g:/evectionFlow.bpmn");
        FileOutputStream outputStream = new FileOutputStream(file);
        IOUtils.copy(bpmnInput, outputStream);
        bpmnInput.close();
        outputStream.close();
    }
    

    4. 历史记录查询

    即使流程定义已经删除了,流程执行的历史信息依然保存在 activiti 的 act_hi_* 相关的表中,我们还是可以查询流程执行的历史信息

    public void findHistoryInfo() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 HistoryService
        HistoryService historyService = processEngine.getHistoryService();
        // 3. 获取 actinst 表的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
        // 4. 查询 actinst 表
        instanceQuery.processInstanceId("5001");
        instanceQuery.orderByHistoricActivityInstanceStartTime();
        // 5. 查询所有内容
        List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
        // 6. 输出
        for (HistoricActivityInstance hi : activityInstanceList) {
            System.out.println(hi.getActivityId());
            System.out.println(hi.getActivityName());
            System.out.println(hi.getProcessDefinitionId());
            System.out.println(hi.getProcessInstanceId());
            System.out.println("----------------------------");
        }
    }
    

    5. 流程的挂起与激活

    某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执行。

    /**
     * 全部流程实例的挂起和激活
     */
    @Test
    public void suspendAllProcessInstance() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3. 查询流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("evection").singleResult();
        // 4. 获取当前流程定义的实例是否都是挂起状态
        boolean suspended = processDefinition.isSuspended();
        // 5. 获取流程定义的 id
        String definitionId = processDefinition.getId();
        // 6. 如果是挂起,改为激活状态,如果是激活状态,改为挂起状态
        if (suspended) {
            repositoryService.activateProcessDefinitionById(definitionId, true, null);
        } else {
            repositoryService.suspendProcessDefinitionById(definitionId, true, null);
        }
    }
    
    /**
     * 挂起或激活单个流程实例
     */
    @Test
    public void suspendSingleProcessInstance() {
        // 1. 获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2. 获取 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 3. 得到当前流程实例的暂停状态
        ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId("27501").singleResult();
        boolean suspended = instance.isSuspended();
        // 4. 获取流程实例 id
        String instanceId = instance.getId();
        // 5. 如果是挂起,改为激活状态,如果是激活状态,改为挂起状态
        if (suspended) {
            runtimeService.activateProcessInstanceById(instanceId);
        } else {
            runtimeService.suspendProcessInstanceById(instanceId);
        }
    }
    

  • 相关阅读:
    前后端分离实践 — 如何解决跨域问题
    bower 和 npm 的区别详细介绍
    yeoman-bower-grunt之间的关系
    软件开发环境-开发环境、测试环境、生产环境的区别
    Tomcat下配置JNDI的三种方式
    SSE
    Java动态代理
    Css之Relative
    多线程之——死锁
    JVM
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/15269475.html
Copyright © 2020-2023  润新知