我有一个基于数据库的通道和一个简单的集成流程,如下所示:
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
(或自定义建议)以在那里处理异常。
请参阅将行为添加到端点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句