工作流 - 流程实例

suaxi
2023-05-25 / 0 评论 / 64 阅读 / 正在检测是否收录...

1. 概念

流程实例(ProcessInstance)代表流程定义的执行实例

一个流程实例包括了所有的运行节点,可以通过这个对象来了解当前流程实例的进度等信息,例如:用户或者程序按照流程定义的内容发起了一个流程,这就是一个流程实例

1.概念.png

2. 业务管理

流程定义部署在Activiti后,我们就可以在系统中通过Activiti去管理流程的执行,但是如果要将流程实例和业务数据关联,这时需要使用到Activiti中预留的BusinessKey(业务标识)来关联

@Test
public void associateBusinessKey() {
    //1.获取ProcessEngine对象
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    //2.RuntimeService
    RuntimeService service = engine.getRuntimeService();
    //3.启动流程,添加businessKey
    ProcessInstance instance = service.startProcessInstanceByKey("evection", "10001");
    System.out.println("businessKey: " + instance.getBusinessKey());
}

3. 流程实例的挂起和激活

在实际场景中可能由于流程变更需要将当前运行的流程暂停而不删除,流程暂停后将不能继续执行

(1)全部流程挂起

操作流程的定义为挂起状态,该流程定义下边所有的流程实例全部暂停。 流程定义为挂起状态时,该流程定义将不允许启动新的流程实例,同时该流程定义下的所有的流程实例都将全部挂起暂停执行

@Test
public void processSuspendOrActive() {
    //1.获取ProcessEngine对象
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    //2.RepositoryService
    RepositoryService service = engine.getRepositoryService();
    //3.查询流程定义的对象
    ProcessDefinition definition = service.createProcessDefinitionQuery().processDefinitionKey("evection").singleResult();
    //4.获取当前流程定义的状态
    String id = definition.getId();
    boolean suspended = definition.isSuspended();
    //5.挂起 ---> 激活,否则反之
    if (suspended) {
        service.activateProcessDefinitionById(id, true, null);
        System.out.println("流程:" + id + ",已激活");
    } else {
        service.suspendProcessDefinitionById(id, true, null);
        System.out.println("流程:" + id + ",已挂起");
    }
}

注:挂起流程定义后,实例对象中(数据库数据的状态)的状态会修改为 2,此时如果再去操作对应的流程实例会抛出异常,将挂起的流程转变为激活状态,则对应的状态值会从 2 更新为 1(即可以正常处理业务流程)

4. 单个实例挂起

针对单个流程执行挂起操作,则将指定的流程实例挂起,当前流程定义的其他流程实例不受干扰,此时如果去操作已挂起的该流程实例,同理会抛出异常

@Test
public void singleProcessSuspendOrActive() {
    //1.获取ProcessEngine对象
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    //2.RuntimeService
    RuntimeService service = engine.getRuntimeService();
    //3.查询流程实例对象
    ProcessInstance instance = service.createProcessInstanceQuery().processInstanceId("2501").singleResult();
    //4.获取相关状态
    String id = instance.getId();
    boolean suspended = instance.isSuspended();
    //5.执行挂起/激活
    if (suspended) {
        service.activateProcessInstanceById(id);
        System.out.println("流程实例:" + id + ",已激活");
    } else {
        service.suspendProcessInstanceById(id);
        System.out.println("流程实例:" + id + ",已挂起");
    }
}
0

评论 (0)

取消