java - 事务提交/回滚不在 Spring 集成通道适配器上
问题描述
我正在使用 spring 集成来设置消息流。我从目录中读取文件,并对它们做一些事情。我在入站通道适配器上设置了一个轮询器,其中包括一个事务管理器和同步工厂。同步工厂将提交后和回滚后推送到通道,将原始文件推送到成功或失败文件夹。这一切都很好。
现在的问题是,在处理某些文件时,它们可能会产生新消息,我想循环通过相同的过程。我不希望这些新文件参与到原始文件的事务中,但我确实希望它们有自己的事务上下文。
我试图用多种方法给这只猫剥皮以使其工作。我得到的最接近的是创建一条新消息,并使用网关推送到起始通道(通过异步调用以终止事务) - 但是因为事务定义在文件 inbound-channel-adapter 上,新消息没有获得事务支持,因此无论它们通过还是失败,它们都不会被推送到适当的文件夹。
这是正确的架构,还是有我不知道应该使用的模式?
(ps我不只是将新文件写入适配器轮询的原始目录的原因是我想在它们中包含一个指向父文件的标头。因此我必须创建一条消息)。
任何想法将不胜感激。
解决方案
该@MessagingGateway
方法可以用@Async
和标记@Transactional
。因此,对此类子流的调用将发生在具有自己事务的另一个线程上。或者,@Async
您可以添加一个propagation = Propagation.REQUIRES_NEW
. 因此,子流程将开始自己的事务,而包装事务将被暂停。
onCommit/onRollback
我将在该调用try...catch
周围实施。@MessagingGateway
推荐阅读
- spotify - 通过 Spotify API 获取流总数和跟踪发布日期
- node.js - AWS Lambda :: 如何在我的本地 ubuntu 机器上测试我的代码?
- android - 如何将进入动画设置为 RecyclerView 项目?
- charts - Amchart 响应问题
- hive - 为什么 Hive 和 bigSQL 中存在 1 条记录的数据不匹配?
- android - Android Room 是否提供 SqliteOpenHelper onCreate() 和 onUpdate() 替代方案?
- python - python3.6模板中的cgal c++集成错误
- javascript - 为什么在 React 中删除后仍然从本地存储中获取数据?
- excel - Excel Sumif,Sumifs 在多列中有部分字符串?
- php - 从不同表中的类别 id 获取类别名称