Базовый вопрос на самом деле очень прост, давайте рассмотрим следующую цепочку:
<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
(для каждого разделенного сообщения) в той же транзакции / потоке, что и исходное сообщениеили они будут обрабатываться каждый в своей собственной транзакции?