当前位置: 首页 > 知识库问答 >
问题:

事务提交/回滚不在spring集成通道适配器上

汝宏伯
2023-03-14

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

现在的问题是,当处理一些文件时,它们可能会产生新的消息,我想通过同样的过程循环。我不希望这些新文件涉及到原始文件的事务,但我希望它们有自己的事务上下文。

我试过用多种方法剥这只猫的皮来让它工作。我所得到的最接近的方法是创建一个新消息,并使用网关将其推送到起始通道(通过异步调用以终止事务)-然而,由于事务定义位于文件入站通道适配器上,新消息没有得到事务性支持,因此无论它们通过还是失败,都不会被推送到适当的文件夹。

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

(另外,我不只是将新文件写入适配器轮询的原始目录的原因是,我希望包含一个指向父文件的头文件。因此,我必须创建一条消息)。

任何想法都将不胜感激。

共有1个答案

裴甫
2023-03-14

@messaginggateway方法可以用@async@transactional标记。因此,对这样一个子流的调用将发生在带有自己事务的另一个线程上。或者,您可以添加propagation=propagation.requires_new来代替@async。因此,子流将启动自己的事务,包装事务将被挂起。

我将在@messaginggateway调用周围使用try...catch实现oncommit/onrollback

 类似资料:
  • 我试图将从Quickfix读取消息(读取修复消息)配置到spring集成中。我知道我可以使用入站通道适配器从外部源(如QuickFix)读取数据。您能提供如何编写事件驱动入站通道适配器的示例吗?我有以下配置不起作用

  • 我对Spring集成中通道适配器和网关的差异感到困惑。正如@gary-russell在https://stackoverflow.com/a/29992267/467944中所述,通道适配器是非分布式的,而网关是双向的。如果是这种情况,为什么有amqp入站网关和amqp出站网关? 我最终要完成的是以下几点: 在控制器内接收到Http请求 将消息放在amqp队列上 消费者使用消息并将结果放入结果队列

  • 我目前在Spring集成中处理JMS事务时遇到困难。我正在创建的集成流程如下所示: JMS队列A- 我希望在JMS队列B和JMS队列C上保证消息的传递。然而,为了使传递稍微困难一些,我希望将导致错误的消息存储在单独的JMQ队列上,并在队列a上确认消息。 但是,如果我对此进行测试并在队列C上设置消息之前抛出错误(让我们假设队列B首先完成,队列C其次完成),事务将确认队列A并在队列B和错误队列上提交消

  • 如何通过注释而不是常规配置文件配置入站通道适配器?我可以为会话工厂定义bean,如下所示: 如何配置通过注释下给出的入站通道适配器? 我正在寻找的是在应用程序启动时连接所有bean,然后公开一些方法来开始轮询服务器,处理它们,然后从本地删除它们,类似于 其中getPollableChannel()为我提供了用于轮询的bean。

  • 问题内容: 入站和出站通道适配器之间的根本区别是什么? 任何示例都将非常有帮助。 我已经查看过Spring文档,这种“方向性”的区别对我来说还不清楚。我支持配置了outbound-channel-adapter的应用程序,但是我发现使用 出站 标签可以直观地了解行为计数器。该适配器获取一个外部文件,然后 将其 引入应用程序中, 在 该应用程序中我们解析文件并保留数据。 这类似于这个问题,但是我想更

  • 我们的应用程序中存在以下问题。消息通过入站通道适配器传入,并使用持久消息存储在聚合器中累积。一旦释放策略中定义的条件返回true,消息将被发送到处理的下一阶段。如果在下一个处理阶段抛出异常,事务将回滚,消息将再次放入持久消息存储中。但是,事务不会将消息放回原始队列,因为消息一旦放在聚合器中就会被确认。这不是我们想要的。理想情况下,如果在处理聚合器已批处理的其中一条下游消息时发生异常,则事务只会回滚