【问题标题】:Transaction boundary of spring integration splitterspring集成分离器的事务边界
【发布时间】:2019-07-05 19:03:18
【问题描述】:

基本问题其实很简单,让我们考虑以下链:

<int:poller id="inputPoller" task-executor="inputTaskPool" fixed-delay="${input.poller.interval}"
            receive-timeout="${input.poller.timeout}" max-messages-per-poll="${poller.messages}">
    <int:transactional transaction-manager="chainedTransactionManager"/>
</int:poller>

<int:chain id="someInputChain" input-channel="theInputChannel">
    <int:poller ref="inputPoller" />
    <!-- various transfomers, nothing asynchronous -->
    <int:splitter id="messageSplitter" ref="messageSplitterService" apply-sequence="false" />
    <int:transformer id="messagePersister" ref="messagePersisterService" method="persistMessageMetadata" />
</int:chain>

messageSplitter 生成的所有消息会在同一个事务和同一个线程中,还是它们随后会在不同的事务/来自不同的线程中处理?

拆分器(同步)调用 REST 服务,该服务将为其提供消息必须经过的目标通道列表。然后它将创建如此多的副本并为输出通道设置一个标题。该列表从拆分器返回。 messagePersister 会将新消息的密钥与一些元数据一起存储在数据库表中。

messagePersisterService.persistMessageMetadata 的每次调用(对于每个拆分的消息)是在与原始消息相同的事务/线程中还是在各自的事务中处理?

【问题讨论】:

  • 你已经问过这样的问题,我已经给你一些答案了。
  • 不,这是一个不同的问题。上下文相同,但问题不同。我很乐意删除上下文,使其不再看起来像重复。我认为更多信息只会有帮助:)
  • @ArtemBilan 好了,删除了上下文,现在它是关于拆分器的事务边界的,而无需详细说明为什么我有兴趣知道这一点。

标签: java spring transactions spring-integration


【解决方案1】:

在 Spring Integration 中,除非您明确说明,否则不会进入新线程。 因为你有一个&lt;int:splitter&gt;&lt;chain&gt;,它真的会为链中的下一个处理程序一个接一个地生成拆分项目。在&lt;poller&gt; 发起的任务中,所有事情都发生在同一个线程上,在您的情况下,发生在 TX 内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 2016-06-05
    • 1970-01-01
    • 2018-11-23
    • 2020-07-07
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多