我正在使用spring集成来设置消息流。我从目录中读取文件,并对它们进行处理。我已经在我的入站通道适配器上设置了一个轮询程序,其中包括事务管理器和同步工厂。 同步工厂将提交后和回滚后推送到通道,这会将原始文件推送到成功或失败文件夹。 一切正常。
现在的问题是,在处理某些文件时,它们可能会产生新的消息,我希望通过相同的过程进行循环。我不希望这些新文件包含在原始文件的事务中,但我希望它们具有自己的事务上下文。
我曾尝试用多种方法给这只猫换皮,以使其正常工作。我得到的最接近的消息是创建一条新消息,并使用网关推送到起始通道(通过异步调用以终止事务)-但是,由于事务定义在文件inbound-channel-adapter上,新邮件不会获得事务支持,因此无论它们是通过还是失败,都不会被推送到相应的文件夹中。
这是正确的体系结构,还是我不知道应该使用哪种模式?
(ps之所以我不只是将新文件写入适配器正在轮询的原始目录的原因是,我想在其中包含一个指向父文件的标头。因此,我必须创建一条消息)
任何想法都会受到赞赏。
答案 0 :(得分:2)
可以用@MessagingGateway
和@Async
标记@Transactional
方法。因此,对此类子流的调用将在具有自己事务的另一个线程上进行。或者,您可以仅添加一个@Async
来代替propagation = Propagation.REQUIRES_NEW
。因此,子流将开始其自己的事务,而包装的事务将被挂起。
我将在该onCommit/onRollback
调用周围使用try...catch
来实现@MessagingGateway
。