我有一个基于db的通道和一个简单的集成流程,如下所示:
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()
从轮询器中删除父事务并“修复”问题,但它从不调用事务同步工厂(这是有意义的)。
有没有一种方法允许嵌套事务抛出异常并仍然处理消息?
1条答案
按热度按时间bvhaajcl1#
您可以添加
.gateway()
中间流并通过errorChannel
或者你可以添加一个ExpressionEvaluatingRequestHandlerAdvice
(或自定义建议)发送到处理程序的端点以处理那里的异常。请参见向端点添加行为。