【问题标题】:How to add transaction support to Java DSL integration flows如何向 Java DSL 集成流添加事务支持
【发布时间】:2021-01-14 02:21:26
【问题描述】:

我必须向集成流添加事务支持。假设有 3 个变压器。第一个和第三个转换器应该在同一个事务中完成,但第二个不应该在任何事务中完成。因此,如果第三个转换器发生错误,则不应提交来自第一个和第三个转换器的所有更改,但应提交来自第二个转换器的更改。我怎样才能做到这一点?我尝试添加.transform(FirstMessageTransformer, e -> e.transactional(true)),但随后所有转换器都在事务中完成。我也尝试添加.transform(FirstMessageTransformer, e -> e.transactional(false)),但它似乎效果不佳,因为所有转换器都提交了更改,即使发生异常也是如此。

@Bean
public IntegrationFlow myMessageFromMessageAmqpInboundFlow() {
    return IntegrationFlows.from(myInboundChannel)
            .transform(FirstMessageTransformer)
            .transform(SecondMessageTransformer)
            .transform(ThirdMessageTransformer)
            .channel(anOutputChannel)
            .get();
}

【问题讨论】:

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


    【解决方案1】:

    试试这样:

            .transform(FirstMessageTransformer, e -> e.transactional(true))
            .transform(SecondMessageTransformer, 
                            e -> e.transactional(
                                         new TransactionInterceptorBuilder()
                                                 .transactionManager(txManager)
                                                 .propagation(Propagation.NOT_SUPPORTED)
                                                 .build()))
            .transform(ThirdMessageTransformer)
    

    这样,您将拥有一个以FirstMessageTransformer 开头的整个子流的事务,而Propagation.NOT_SUPPORTED 将让SecondMessageTransformer 暂停当前事务并仅在事务外执行此MessageHandler。完成SecondMessageTransformer 的工作后,原始事务应恢复并在流程的其余部分继续。

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2017-06-28
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多