代码之家  ›  专栏  ›  技术社区  ›  Tristan

Spring集成和JPA事务

  •  0
  • Tristan  · 技术社区  · 6 年前

    我正在使用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 回复  |  直到 6 年前
        1
  •  1
  •   Artem Bilan    6 年前

    如果你在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