Spring Integration и JPA транзакции - PullRequest
0 голосов
/ 02 июля 2018

Я использую интеграцию Spring для получения формальных XML-сообщений XMPP:

<int-xmpp:inbound-channel-adapter id="xmppInboundAdapter" channel="xmppInbound" xmpp-connection="xmppConnection" auto-startup="true" />
<int:channel id="xmppInbound" />
<int:service-activator ref="messageRouterService" input-channel="xmppInbound" />

У меня уже есть некоторые постоянные функции, и это работает (хранение сообщений в базе данных, анализ сообщений по сравнению с тем, что в базе данных, ...).

Теперь у меня есть метод, который должен быть транзакционным, потому что мне нужно инициализировать 2 коллекции, связанные с 1 сущностью, поэтому вторая коллекция лениво инициализируется путем вызова метода для него.

Это прекрасно работает в JUnit, но что мне нужно сделать, чтобы он работал в основном коде? Могу ли я просто поместить @Transactional на любой уровень, или он должен быть в корне всего процесса или даже как-то объявлен во входящем адаптере?

1 Ответ

0 голосов
/ 02 июля 2018

Если ваша тяжелая работа с JPA и базой данных действительно только в упомянутом messageRouterService, то этого действительно должно быть достаточно, чтобы пометить этот метод обслуживания аннотацией @Transactional и правильно сослаться на ваш JpaTransactionManager.

Если вы хотите сделать весь поток транзакционным, то начинать с <int-xmpp:inbound-channel-adapter> невозможно, потому что нет хуков для ввода TransactionInterceptor. Тем не менее, вы можете использовать TransactionInterceptorBuilder(true) для получения TransactionHandleMessageAdvice, который обернет весь подпоток, начиная с рекомендованной конечной точки, через <request-handler-advice-chain>: https://docs.spring.io/spring-integration/docs/5.0.6.RELEASE/reference/html/messaging-endpoints-chapter.html#message-handler-advice-chain

...