弹簧积分分离器的交易边界

时间:2019-02-12 07:33:25

标签: java spring transactions spring-integration

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

<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的调用(针对每个拆分的消息)是在与原始消息相同的事务/线程中进行还是在各自的事务中对其进行处理?

1 个答案:

答案 0 :(得分:2)

在Spring Integration中,除非明确说明,否则什么也不会进入新线程。 由于您有一个<int:splitter><chain>,所以它实际上将一个接一个的拆分项生成到链中的下一个处理程序。一切都发生在<poller>发起的任务的同一线程上,并且在您的情况下,发生在TX内。