java - 事务提交/回滚不在 Spring 集成 channel 适配器上

标签 java spring spring-integration

我正在使用 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/

相关文章:

java - 在 Java 中拆分多个分隔符

java - Spring 3.2 和 Hibernate 4 - 由于 SessionFactory 为空而获取 NullPointerException

java - Spring-websockets : Spring security authorization not working inside websockets

java - 使用 Spring Boot 的 Spring Integration SFTP 示例

spring-integration - FTP 入站 channel 适配器的 FTP 问题

java - 在 Spring 中注册自定义属性编辑器

java - 数组初始化

android - 如何在 Spring for Android 中设置 charset=UTF-8?

java - MessageHeaders 在 HttpOutboundGateway 中丢失

java - 复杂的累积查询