【问题标题】:How to handle nested transaction exception in spring integrationSpring集成中如何处理嵌套事务异常
【发布时间】: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


    【解决方案1】:

    您可以添加一个.gateway() 中间流并通过它的errorChannel 处理异常,或者您可以将一个ExpressionEvaluatingRequestHandlerAdvice(或自定义建议)添加到处理程序的端点以在那里处理异常。

    Adding Behavior to Endpoints

    【讨论】:

    • 加里,感谢您的回复。我尝试了这两种方法,但无论我使用自定义建议还是网关,它仍然会回滚父事务并将消息放回原始通道。
    • 编辑问题以显示您尝试过的内容。
    • 似乎可行的解决方法是在messageHandler.process 方法中的子事务上使用Propagation.NESTED。这样即使嵌套事务抛出未处理的异常,父事务也不会设置为rollback-only,并且仍将提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多