Camunda流程卡在服务任务时如何通过REST API完成任务
Camunda服务任务卡节点无法推进的解决方案
首先明确核心逻辑差异:服务任务是Camunda引擎自动调度执行的节点,不会生成可供task/{taskid}/complete接口操作的用户任务实例,你之前常用的任务完成接口仅对人工处理的用户任务生效,对卡住的服务任务无效,可按以下优先级选择处理方案:
优先方案:修复异常后触发引擎自动重试(无业务侵入,最稳妥)
90%以上的服务任务卡滞,都是节点绑定的执行逻辑抛出未捕获异常导致的,引擎会把这个执行逻辑挂到运行时作业表等待重试,重试次数耗尽后就会停在节点不动:
- 第一步先定位异常:查Camunda引擎的运行日志,或者查运行时库的
ACT_RU_JOB表,找到对应流程实例关联的作业记录,EXCEPTION_MSG_字段会存完整的报错原因,常见问题包括JavaDelegate实现类找不到、外部接口调用超时、脚本执行语法错误、流程变量类型不匹配、外部任务工作器宕机等。 - 修复对应报错问题后,调用作业重试接口重置重试次数:
POST /engine-rest/job/{jobId}/retries
请求体传{"retries": 3}即可,引擎会自动重新调度执行当前卡住的服务任务,执行成功后流程会自动往下流转,不会丢失任何节点逻辑。 - 如果你是用外部任务模式实现的服务任务:不需要操作作业表,直接查
ACT_RU_EXT_TASK表找到当前节点绑定的外部任务实例:如果是工作器没上报执行结果,就调用POST /engine-rest/external-task/{externalTaskId}/complete传入需要的流程变量完成任务;如果是工作器宕机导致任务被长期锁定,调用POST /engine-rest/external-task/{externalTaskId}/unlock释放锁,等正常工作器拉取任务执行即可。
兜底方案:跳过卡滞节点直接推进(仅用于节点逻辑已补执行/测试环境场景)
如果当前服务任务的业务逻辑已经手动完成、或者逻辑本身不需要执行,必须硬推流程,可以用官方提供的流程实例修改接口操作,不要直接改数据库表避免数据关联错乱:
- 先从流程定义里找到当前卡住的服务任务ID、以及下一个要流转到的节点ID
- 调用流程修改接口:
POST /engine-rest/process-instance/{processInstanceId}/modification
参考请求体如下:{ "skipCustomListeners": false, "skipIoMappings": false, "instructions": [ { "type": "startBeforeActivity", "activityId": "Flow_下一个节点的ID" }, { "type": "cancel", "activityId": "ServiceTask_当前卡住的服务任务ID" } ] }
注意:该操作会直接跳过当前服务任务的所有未执行逻辑,操作前必须确认节点对应的业务动作已经完成,避免出现流程流转成功但业务操作缺失的脏数据。

内容的提问来源于stack exchange,提问作者DeepakTheGeek
相关产品推荐
相关产品推荐

