流程定义和流程实例

流程定义和流程实例相当于Java中的类和对象的关系

BusinessKey

例如我们在流程执行的某一个节点业务中需要对其他业务进行处理,例如订单处理,就可以使用Businesskey进行传递参数
businessKey长度限制 255字符

  1. @Test
  2. void testBusinessKey() {
  3. // 启动流程实例的过程中添加一个businessKey
  4. // 例如出差申请的id
  5. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  6. RuntimeService runtimeService = processEngine.getRuntimeService();
  7. ProcessInstance instance = runtimeService.startProcessInstanceByKey("Leave-1", "1001");
  8. log.info("BusinessKey:{}",instance.getBusinessKey());
  9. }

image.png


挂起/激活流程

例如日常办公中月底不接受报销审批,年底不接受贷款审批
或者一些流程需要进行修改时也可以将流程进行挂起,挂起后的流程不会再继续执行

挂起

1、将整个流程定义下的流程实例挂起

  1. /**
  2. * 挂起当前流程定义下的所有的流程实例
  3. */
  4. @Test
  5. void suspendAllProcessInstances() {
  6. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  7. RepositoryService repositoryService = processEngine.getRepositoryService();
  8. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
  9. .processDefinitionKey(key)
  10. .singleResult();
  11. // 获取当前定义下的实例是否都是挂起状态
  12. boolean suspended = processDefinition.isSuspended();
  13. // 获取流程定义id
  14. String definitionId = processDefinition.getId();
  15. // 如果是挂起状态,修改为激活状态,反之亦然
  16. if(suspended){
  17. /**
  18. * @param1 definitionId
  19. * @param2 是否激活
  20. * @param3 激活时间
  21. */
  22. repositoryService.activateProcessDefinitionById(definitionId,true,null);
  23. log.info("流程{}已激活",definitionId);
  24. }else{
  25. /**
  26. * @param1 definitionId
  27. * @param2 是否挂起
  28. * @param3 挂起暂停时间
  29. */
  30. repositoryService.suspendProcessDefinitionById(definitionId,true,null);
  31. log.info("流程{}已暂停",definitionId);
  32. }
  33. }

挂起之后当前流程定义下的所有流程实例无法继续执行
image.png


2、挂起单个流程实例

    /**
     * 挂起单独的流程实例
     */
    @Test
    void suspendSingleProcessInstance(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
                                                        .processInstanceId("12501")
                                                        .singleResult();
        boolean suspended = instance.isSuspended();
        String instanceId = instance.getId();
        if(suspended) {
            runtimeService.activateProcessInstanceById(instanceId);
            log.info("流程{}已激活",instanceId);
        }else{
            runtimeService.suspendProcessInstanceById(instanceId);
            log.info("流程{}已暂停",instanceId);
        }
    }

只有当前的流程实例无法继续执行,其余流程实例不受影响