FlowAble流程启动

flowable流程部署之后获得流程模板ID, 业务系统即可根据流程模板ID实例化流程。demo项目飞机 流程引擎Demo项目 Git clone飞机 Clone Https


一、启动流程

启动流程主要用的到有: org.flowable.engine.IdentityService、org.flowable.engine.RuntimeService、org.flowable.engine.TaskService 以及自定义的CustomizeConditionService实现。其中CustomizeConditionService主要用于条件分支参数的获取(也可以通过其他方法写入, 最终保证启动流程入参的Map中有条件参数即可)。

// 设置发起人
identityService.setAuthenticatedUserId(params.getUserId());

//设置条件参数
Map<String, Object> varMap = new HashMap<>(8);
//写入数据权限部门(其他条件参数也一样, 只要流程执行中涉及到的自定义参数, 都需要写入该Map之中)
varMap.put("departmentId", jsonObject.get("departmentId"));

ProcessInstance processInstance;
try {
    //deploy.getDeployModelId() 为之前流程部署时返回的流程模板ID, varMap为上文创建的流程变量集合对象
    processInstance = runtimeService.startProcessInstanceById(deploy.getDeployModelId(), varMap);
    //返回启动后的流程实例ID
    return processInstance.getProcessInstanceId();
} catch (Exception e) {
    //捕捉EL表达式中抛出的异常
    if (e.getCause() instanceof ELException && e.getCause().getCause() instanceof RuntimeException) {
        throw new RuntimeException(e.getCause().getCause().getMessage());
    }
    log.info("[FlowApiServiceImpl].[startFlow] ------> Business System Startup Process, Start, params = {}", JSON.toJSONString(params));
    log.error("[FlowApiServiceImpl].[startFlow] ------> Business System Startup Process, Error, e:", e);
    throw new RuntimeException("启动流程异常:" + e.getMessage());
}

自此, 一个基于流程模板的流程实例就完成创建了, 异常捕捉特别处理 ELException 是由于我们自定义的El表达式调用的方法抛出的异常全部被Flowable封装成了ELException 因此需要我们自己从ELException中提取出需要的异常信息重新处理。正确启动流程之后,系统会返回流程实例ID, 业务数据需记录该流程实例ID, 之后的流程实例查询等操作需要此ID。

二、一些常用的其他方法

1.流程实例信息查询

//通过流程实例ID查询未结束流程信息(可通过此方法查询流程是否结束)
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();

2.获取流程待执行的Task任务

List<Task> taskList = taskService.createTaskQuery().processInstanceId(instanceId).list();