jpa - 如何在 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>
但是,此网关打开的事务包含整个下游流(除非我使用执行程序打破事务边界)。在这种情况下,这不是我想要的:我希望事务只包含更新操作(某种“自动提交”),因为下游流将以更精细的方式处理事务,并且需要处理独立的事务(不要加入外部)。
如果我很好地理解了该链接部分,如果我改为使用 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
,所以看起来这个建议不起作用(至少不是我想要的方式)。
这样做的更好方法是什么?我是否被迫在回复通道上使用带有执行程序的调度程序来打破事务边界?
解决方案
让它像这样:
<tx:advice>
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
默认情况下它没有任何方法匹配,因此这样的建议不会应用于 internal AdvisedRequestHandler
。
推荐阅读
- python - 3 递归 T(n) 和主定理的递归
- python - 使用 OpenCV 检测图像颜色并将颜色写入列表
- google-apps-script - 如何删除旧的转换文件并使用应用脚本替换为新文件?
- python - 一定时间后终止循环
- laravel - Laravel 多数据同步到枢轴
- javascript - 是否可以使用 2 提示向用户询问 JavaScript 中的数据
- java - 公开使用 JSR223 ScriptEngine 定义的 JVM (Kotlin) 类
- node.js - 在猫鼬 nodejs 中使用扩展模式时丢失数据
- python - 如何使用字典中的值注释网格图
- javascript - NGRX 商店。无法分配给对象“[对象数组]”的只读属性“18”