Spring Integration和JPA事务

时间:2018-07-02 16:51:33

标签: spring spring-data-jpa spring-integration

我正在使用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" />

我已经具有一些持久性功能,并且可以正常工作(将消息存储在数据库中,将消息与数据库中的消息进行比较,...)。

现在我有一个需要进行事务处理的方法,因为我需要初始化与1个实体相关的2个集合,因此第二个集合可以通过在其上调用方法来进行延迟初始化。

这在JUnit中可以正常工作,但是我需要做些什么才能使其在主代码中起作用?我可以将@Transactional放在任何级别吗,还是需要将它放在整个过程的根本,甚至需要在入站适配器中以某种方式声明?

1 个答案:

答案 0 :(得分:1)

如果您实际上只是在提到的messageRouterService中使用JPA和数据库,那么使用@Transactional批注标记该服务方法并正确引用您的{{ 1}}。

如果想让整个流程具有事务性,那么就不可能从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

来包装从建议端点开始的整个子流。