代码之家  ›  专栏  ›  技术社区  ›  Yanick Salzmann

Spring集成拆分器的事务边界

  •  0
  • Yanick Salzmann  · 技术社区  · 6 年前

    基本问题实际上非常简单,让我们考虑以下链:

    <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 在同一个事务和同一个线程中,或者它们随后会在不同的事务/不同的线程中被处理?

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

    是每一个呼叫 messagePersisterService.persistMessageMetadata (对于每个拆分的消息)在与原始消息相同的事务/线程中,还是将在各自的事务中分别处理它们?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Artem Bilan    6 年前

    在Spring集成中,除非您明确地说了这一点,否则任何东西都不会进入新的线程。 因为你有一个 <int:splitter> 威辛 <chain> 它真的会产生一个又一个被分割的项目到链中的下一个处理程序。在由 <poller> 在你的情况下,在德克萨斯州。