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

TransactionSynchronizationFactory提前删除文件致流程失败的原因排查

问题原因分析

1. Poller事务边界与异步流程不匹配

你配置的Poller事务是围绕单次轮询的消息同步处理逻辑的,当流程执行到aggregate()完成时,Poller会判定当前消息的处理已经结束,随即提交事务,触发afterCommitExpression中的payload.delete()删除源文件。但如果你的流程中存在异步操作(比如WebClient Gateway调用采用非阻塞异步API,或者split()后的子流是异步执行),此时异步任务可能还未完成,后续依赖该文件的操作自然会失败。

2. 伪事务管理器的即时提交特性

你使用的pseudoTransactionManager(比如NoOpTransactionManager这类伪事务管理器)本身不具备“等待异步操作完成”的事务能力,它的事务提交是即时触发的——只要主流程走到aggregate()节点,就会立即执行事务提交逻辑,不会等待异步子任务或后续流程步骤完成。

3. 事务同步的触发时机绑定错误

TransactionSynchronizationFactory的afterCommit是绑定在Poller的事务生命周期上的,而非整个流程的生命周期。你的流程包含split()、异步调用、resequence()、aggregate()等多阶段操作,但Poller的事务只覆盖到aggregate()完成这一步,没有延伸到整个流程的最终结束点,导致文件被提前删除。

关键代码对应点

Poller配置将事务同步工厂绑定到轮询器,事务范围被限制在轮询后的同步处理阶段:

return Pollers.fixedDelay(Duration.ofMinutes(pollInterval))
                .maxMessagesPerPoll(maxMessagesPerPoll)
                .transactionSynchronizationFactory(transactionSynchronizationFactory)
                .transactional(pseudoTransactionManager)
                .advice(loggingAdvice);

事务同步的删除操作直接绑定在事务提交/回滚后:

syncProcessor.setAfterCommitExpression(parser.parseExpression("payload.delete()"));
syncProcessor.setAfterRollbackExpression(parser.parseExpression("payload.delete()"));

内容的提问来源于stack exchange,提问作者Rayyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:30:49