如何处理 spring 集成中的嵌套事务异常
How to handle nested transaction exception in spring integration
我有一个基于数据库的渠道和一个简单的集成流程,如下所示:
return IntegrationFlows.from("messageChannel")
.handle(messageHandler, "process", consumer ->
consumer.poller(poller -> poller
.fixedDelay(3000)
.transactional()
.transactionSynchronizationFactory(messageStoreSynchronizationFactory)
.taskExecutor(taskExecutor)
.receiveTimeout(1000)
.maxMessagesPerPoll(10)))
.get();
作为消息处理的一部分 (messageHandler.process
),我需要打开嵌套事务以连接到其他数据库。问题是任何可能从嵌套事务中抛出的未处理异常都会将我的父事务设置为 rollback-only
,这会将我的消息放回通道。这会创建一个阻塞通道的循环,直到解决嵌套事务的问题。
理论上,我应该在嵌套事务中捕获并处理异常,并且永远不会传播到父事务,但很难用我当前的项目架构强制执行。
从轮询器中删除 .transactional()
会从图片中删除父事务并“修复”问题,但它永远不会调用事务同步工厂(这是有道理的)。
有没有办法让嵌套事务抛出异常,仍然处理消息?
您可以添加一个 .gateway()
中流并通过它的 errorChannel
处理异常,或者您可以向处理程序的端点添加一个 ExpressionEvaluatingRequestHandlerAdvice
(或自定义建议)来处理那里的例外。
我有一个基于数据库的渠道和一个简单的集成流程,如下所示:
return IntegrationFlows.from("messageChannel")
.handle(messageHandler, "process", consumer ->
consumer.poller(poller -> poller
.fixedDelay(3000)
.transactional()
.transactionSynchronizationFactory(messageStoreSynchronizationFactory)
.taskExecutor(taskExecutor)
.receiveTimeout(1000)
.maxMessagesPerPoll(10)))
.get();
作为消息处理的一部分 (messageHandler.process
),我需要打开嵌套事务以连接到其他数据库。问题是任何可能从嵌套事务中抛出的未处理异常都会将我的父事务设置为 rollback-only
,这会将我的消息放回通道。这会创建一个阻塞通道的循环,直到解决嵌套事务的问题。
理论上,我应该在嵌套事务中捕获并处理异常,并且永远不会传播到父事务,但很难用我当前的项目架构强制执行。
从轮询器中删除 .transactional()
会从图片中删除父事务并“修复”问题,但它永远不会调用事务同步工厂(这是有道理的)。
有没有办法让嵌套事务抛出异常,仍然处理消息?
您可以添加一个 .gateway()
中流并通过它的 errorChannel
处理异常,或者您可以向处理程序的端点添加一个 ExpressionEvaluatingRequestHandlerAdvice
(或自定义建议)来处理那里的例外。