首页 > 解决方案 > 如何在 Spring Integration 中将事务范围限制为仅更新 JPA 出站网关(类似于“自动提交”)

问题描述

我有一个从轮询器开始的集成流程。这不会打开交易。在该流程中,我有一个 JPA 更新出站网关:

<int-jpa:updating-outbound-gateway
  request-channel="requestChannel"
  reply-channel="replyChannel"
  named-query="myUpdatingJpqlQuery"
  entity-manager-factory="entityManagerFactory">
  <int-jpa:transactional
    transaction-manager="transactionManager" />
  <int-jpa:parameter name="param1" expression="payload" />
  <int-jpa:parameter name="param2"
    expression="T(java.time.Instant).now()" />
</int-jpa:updating-outbound-gateway>

但是,此网关打开的事务包含整个下游流(除非我使用执行程序打破事务边界)。在这种情况下,这不是我想要的:我希望事务只包含更新操作(某种“自动提交”),因为下游流将以更精细的方式处理事务,并且需要处理独立的事务(不要加入外部)。

文档似乎确实证实了这一点:https ://docs.spring.io/spring-integration/docs/5.4.11/reference/html/messaging-endpoints.html#tx-handle-message-advice

如果我很好地理解了该链接部分,如果我改为使用 a<request-handler-advice-chain>和 a<tx:advice>我应该得到想要的结果。

但是,如果我使用这个:

<int-jpa:updating-outbound-gateway
  request-channel="requestChannel"
  reply-channel="replyChannel"
  named-query="myUpdatingJpqlQuery"
  entity-manager-factory="entityManagerFactory">
  <int-jpa:parameter name="param1" expression="payload" />
  <int-jpa:parameter name="param2"
    expression="T(java.time.Instant).now()" />
  <int-jpa:request-handler-advice-chain>
    <tx:advice transaction-manager="transactionManager" />
  </int-jpa:request-handler-advice-chain>
</int-jpa:updating-outbound-gateway>

我得到了一个javax.persistence.TransactionRequiredException,所以看起来这个建议不起作用(至少不是我想要的方式)。

这样做的更好方法是什么?我是否被迫在回复通道上使用带有执行程序的调度程序来打破事务边界?

标签: jpatransactionsspring-integration

解决方案


让它像这样:

<tx:advice>
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

默认情况下它没有任何方法匹配,因此这样的建议不会应用于 internal AdvisedRequestHandler


推荐阅读