【问题标题】:Use of ConsumerEndpointSpec.transactional() in Spring Integration DSL在 Spring Integration DSL 中使用 ConsumerEndpointSpec.transactional()
【发布时间】:2022-07-11 23:54:58
【问题描述】:

我对以下示例中transactional() 的行为有疑问:

    @Bean
    IntegrationFlow myFlow(
            EntityManagerFactory entityManagerFactory,
            TransactionManager transactionManager
    ) {
        return IntegrationFlows.from(MY_CHANNEL)
                .routeToRecipients(route -> route
                        .recipientFlow(flow -> flow
                                .handle(Jpa.updatingGateway(entityManagerFactory)
                                        .namedQuery(DELETE_EVERYTHING)))
                        .recipientFlow(flow -> flow
                                .handle(Jpa.updatingGateway(entityManagerFactory)))
                        .transactional(transactionManager))
                .get();
    }

我的想法是我首先删除数据库表的内容,然后立即用新数据填充同一个表。在此示例中,.transactional() 是否会确保仅在第二步(插入新数据)成功时才将第一步(删除)提交给数据库?对于这种行为,我可以参考文档的哪一部分?

【问题讨论】:

    标签: spring-integration spring-transactions spring-integration-dsl


    【解决方案1】:

    您需要阅读此文档:https://docs.spring.io/spring-integration/docs/current/reference/html/transactions.html#transactions

    只要两个收件人都在同一个线程上执行,因此您的假设是正确的,因此是按顺序执行的。

    TransactionInterceptor 将申请RecipientListRouter.handleMessage()。这就是接收者的“拍卖”发生的地方。

    自从您带着这样的问题来找我们后,您对该配置有什么问题吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2017-12-22
      • 2018-03-24
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多