首页 > 解决方案 > 事务提交/回滚不在 Spring 集成通道适配器上

问题描述

我正在使用 spring 集成来设置消息流。我从目录中读取文件,并对它们做一些事情。我在入站通道适配器上设置了一个轮询器,其中包括一个事务管理器和同步工厂。同步工厂将提交后和回滚后推送到通道,将原始文件推送到成功或失败文件夹。这一切都很好。

现在的问题是,在处理某些文件时,它们可能会产生新消息,我想循环通过相同的过程。我不希望这些新文件参与到原始文件的事务中,但我确实希望它们有自己的事务上下文。

我试图用多种方法给这只猫剥皮以使其工作。我得到的最接近的是创建一条新消息,并使用网关推送到起始通道(通过异步调用以终止事务) - 但是因为事务定义在文件 inbound-channel-adapter 上,新消息没有获得事务支持,因此无论它们通过还是失败,它们都不会被推送到适当的文件夹。

这是正确的架构,还是有我不知道应该使用的模式?

(ps我不只是将新文件写入适配器轮询的原始目录的原因是我想在它们中包含一个指向父文件的标头。因此我必须创建一条消息)。

任何想法将不胜感激。

标签: javaspringspring-integration

解决方案


@MessagingGateway方法可以用@Async和标记@Transactional。因此,对此类子流的调用将发生在具有自己事务的另一个线程上。或者,@Async您可以添加一个propagation = Propagation.REQUIRES_NEW. 因此,子流程将开始自己的事务,而包装事务将被暂停。

onCommit/onRollback我将在该调用try...catch周围实施。@MessagingGateway


推荐阅读