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
相关产品推荐
相关产品推荐

