【发布时间】:2021-04-25 07:41:08
【问题描述】:
我有一个基于数据库的渠道和一个简单的集成流程,如下所示:
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() 会从图片中删除父事务并“修复”问题,但它从不调用事务同步工厂(这是有道理的)。
有没有办法让嵌套事务抛出异常并仍然处理消息?
【问题讨论】:
标签: spring spring-integration spring-transactions