我正在使用 Spring 集成来设置消息流。我从目录中读取文件,并对它们执行一些操作。我在入站 channel 适配器上设置了一个轮询器,其中包括事务管理器和同步工厂。 同步工厂将提交后和回滚后推送到 channel ,将原始文件推送到成功或失败文件夹。 这一切都运行良好。
现在的问题是,在处理某些文件时,它们可能会产生新消息,我想在同一过程中循环这些消息。我不希望这些新文件参与原始文件的事务,但我确实希望它们拥有自己的事务上下文。
我尝试了多种方法来给这只猫剥皮以使其发挥作用。我得到的最接近的是创建一条新消息,并使用网关推送到起始 channel (通过异步调用以终止事务) - 但是因为事务定义位于文件 inbound-channel-adapter 上,新消息没有获得事务支持,因此无论它们通过还是失败,都不会被推送到适当的文件夹。
这是正确的架构,还是有我不知道应该使用的模式?
(另外,我不只是将新文件写入适配器正在轮询的原始目录的原因是我想在它们中包含一个指向父文件的 header 。因此我必须创建一条消息) .
如有任何想法,我们将不胜感激。
最佳答案
@MessagingGateway
方法可以使用@Async
和@Transactional
进行标记。因此,对此类子流的调用将在具有自己事务的另一个线程上发生。或者,您可以添加一个 propagation = Propagation.REQUIRES_NEW
,而不是 @Async
。因此,子流程将启动自己的事务,而包装流程将被挂起。
我将使用围绕该 @MessagingGateway
调用的 try...catch
来实现 onCommit/onRollback
。
关于java - 事务提交/回滚不在 Spring 集成 channel 适配器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52536677/