我有一个从轮询器开始的集成流。这不会打开一个事务。在这个流下面,我有一个更新出站网关的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
。