如何在Activiti中触发结束事件以处理业务数据插入错误?
我来分享几个实用的办法,帮你解决Activiti流程在数据校验出错时触发结束事件的问题:
方案1:用边界错误事件捕获异常终止流程
这是Activiti中处理异常终止的标准方式,步骤如下:
- 在你的数据校验服务代码里,当校验失败并给
error列赋值后,主动抛出一个自定义异常(比如DataValidationFailedException)。 - 在BPMN流程图中,给执行校验的服务任务添加一个边界错误事件,并绑定你抛出的异常类型。
- 把这个边界错误事件的输出流向直接连到结束事件,这样异常被捕获后,流程会立刻终止。
代码示例:
// 执行数据校验 boolean isValid = validateData(x); if (!isValid) { // 给error列赋值 x.setError("校验失败:手机号格式不正确"); dataRepository.save(x); // 抛出自定义异常 throw new DataValidationFailedException("数据校验不通过,终止流程"); }
方案2:手动调用API终止流程实例
如果不想用异常的方式,也可以直接通过Activiti的API强制结束流程:
- 在校验失败并完成
error列赋值后,获取当前的流程实例ID(可以通过当前任务ID、流程变量或者上下文获取)。 - 调用
RuntimeService的deleteProcessInstance()方法,传入流程实例ID和终止原因,直接终止流程。
代码示例:
if (!validateData(x)) { x.setError("校验失败:必填字段为空"); dataRepository.save(x); // 获取当前流程实例ID(假设通过当前任务ID查询) String processInstanceId = taskService.createTaskQuery() .taskId(currentTaskId) .singleResult() .getProcessInstanceId(); // 终止流程 runtimeService.deleteProcessInstance(processInstanceId, "数据校验失败,流程终止"); }
方案3:用排他网关控制流程走向
如果不需要抛出异常,还可以通过流程变量来控制流程分支:
- 在校验完成后,把校验结果(比如
validationPassed)设置为流程变量。 - 在BPMN流程图中,服务任务之后添加一个排他网关,设置两个分支条件:
- 条件
${validationPassed == true}:继续执行后续流程节点 - 条件
${validationPassed == false}:直接流向结束事件
- 条件
代码示例:
boolean validationPassed = validateData(x); if (!validationPassed) { x.setError("校验失败:金额超出限制"); dataRepository.save(x); } // 设置流程变量 runtimeService.setVariable(processInstanceId, "validationPassed", validationPassed);
内容的提问来源于stack exchange,提问作者L.E
相关产品推荐
相关产品推荐

