JBPM 7.59调用GET查询流程节点接口出现Read Timeout超时卡死问题
问题根源
你遇到的GET请求卡死本质是事务死锁,和请求方法是GET还是POST无关:
你在执行中的JBPM流程节点的事务上下文里,调用JBPM自身的管理API查询同一个正在运行的流程实例的节点信息。当前流程实例的事务还未提交,已经持有了对应流程实例记录的数据库行锁;而你调用的GET接口内部需要查询该流程实例的记录,被你未提交的事务所阻塞,最终触发超时。
验证方式
- 查看JBPM服务端的运行日志,搜索
deadlock、lock wait timeout相关报错,确认是否存在事务阻塞记录 - 查看数据库的锁等待列表,以MySQL为例,执行
show engine innodb status可以直接看到当前的死锁信息,确认争用的记录是否对应你查询的processInstanceId
解决方案
按优先级从高到低推荐:
- 优先使用JBPM内部API获取节点信息:不要走HTTP调用REST接口,直接在你的自定义Java节点中注入JBPM的内置服务
ProcessInstanceService,直接调用对应方法获取当前流程实例的节点信息,完全绕开跨事务的锁竞争问题 - 若必须使用REST接口调用:将REST调用改为异步执行,不要阻塞当前流程节点的事务提交。可以把调用逻辑提交到独立线程池执行,等当前节点的事务提交完成后再发起HTTP请求,拿到结果后通过信号事件回传给流程即可
- 临时验证方案:修改JBPM数据源的事务隔离级别为
READ COMMITTED,允许非阻塞读已提交数据,可临时解决锁等待问题,但不推荐生产环境使用
代码优化建议
你的OkHttp请求代码中,GET请求无需携带Content-Type请求头,该头仅用于标记请求体的格式,GET请求无请求体,可直接删除该行配置。
内容的提问来源于stack exchange,提问作者Fasih Ur Rehman
相关产品推荐
相关产品推荐

