spring集成中如何处理嵌套事务异常

v1uwarro  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(320)

我有一个基于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() 从轮询器中删除父事务并“修复”问题,但它从不调用事务同步工厂(这是有意义的)。
有没有一种方法允许嵌套事务抛出异常并仍然处理消息?

bvhaajcl

bvhaajcl1#

您可以添加 .gateway() 中间流并通过 errorChannel 或者你可以添加一个 ExpressionEvaluatingRequestHandlerAdvice (或自定义建议)发送到处理程序的端点以处理那里的异常。
请参见向端点添加行为。

相关问题