Я использую интеграцию Spring для получения формальных сообщений XMPP XML:
<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 на любом уровне, или он должен быть в корне всего процесса или даже каким-то образом объявлен во входящем адаптере?
Если ваша тяжелая работа с 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
Нет, хватит. Меня больше беспокоило, когда у вас было бы больше одного TransactionManager ..
Не могли бы вы быть более точными в отношении «правильного обращения к вашему JpaTransactionManager»? У меня есть аннотация «@EnableTransactionManagement» в классе конфигурации, и этот класс объявляет bean-компонент jpaTransactionManager. Как вы думаете, мне нужно больше?