基本问题实际上非常简单,让我们考虑以下链:
<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
的调用(针对每个拆分的消息)是在与原始消息相同的事务/线程中进行还是在各自的事务中对其进行处理?
答案 0 :(得分:2)
在Spring Integration中,除非明确说明,否则什么也不会进入新线程。
由于您有一个<int:splitter>
和<chain>
,所以它实际上将一个接一个的拆分项生成到链中的下一个处理程序。一切都发生在<poller>
发起的任务的同一线程上,并且在您的情况下,发生在TX内。