You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:51