使用BPMN错误结束事件时,程序首次执行失败即抛异常而非超时后触发

问题解决方法
你现在的问题出在Timer Boundary Event的配置逻辑不对,R5/PT10S是让定时器在任务启动后立刻重复触发5次、每次间隔10秒,并没有和任务的失败重试绑定,所以任务首次失败后边界事件直接触发,导致立刻抛出异常。要实现「失败后重试5次、每次间隔10秒,全部失败再抛异常」的需求,按以下方式调整:
调整定时器与任务失败的绑定逻辑
不要用定时器的重复执行配置,而是把Timer Boundary Event设置为条件触发:- 给执行任务(User/Service Task)添加失败重试变量,比如初始值设为
retryCount=5 - 把定时器的触发条件设为
${execution.getVariable('retryCount') > 0},周期设为PT10S - 任务执行失败时,先递减
retryCount,当retryCount变为0时,再触发Error End Event抛出异常
- 给执行任务(User/Service Task)添加失败重试变量,比如初始值设为
利用BPMN引擎自带的重试机制(推荐)
以Camunda/Activiti这类主流引擎为例,直接在任务属性里配置:- 设置任务的
retries初始值为5,retryTimeout为10000(毫秒,即10秒) - 任务执行失败时,引擎会自动递减
retries,并在超时后自动重试 - 当
retries减到0时,再通过Error End Event抛出异常,或者直接由引擎抛出重试耗尽的错误
- 设置任务的
关闭引擎的失败立即触发开关
部分引擎默认在任务失败时直接触发边界事件,需要在引擎配置中关闭该行为,让重试机制优先执行。
内容的提问来源于stack exchange,提问作者Mr.Simple
相关产品推荐
相关产品推荐

