如何在 Spring 集成中将事务范围限制为 JPA 更新出站网关(类似于 "auto-commit")

How to limit transaction scope to just the JPA updating outbound gateway (sort of "auto-commit") in Spring Integration

我有一个从轮询器开始的集成流程。这不会打开交易。 在那个流程中,我有一个 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

如果我很好地理解链接部分,如果我改为使用 <request-handler-advice-chain><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,所以这个建议似乎没有用(至少不是我想要的方式)。

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

像这样:

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

默认情况下没有任何方法匹配,因此这样的建议不适用于内部AdvisedRequestHandler