2

我想让流程的特定部分成为事务性的。例如,我想在一个事务块中进行前两个转换操作。这是我使用的流程代码:

@Bean
public IntegrationFlow createNumberRange() {

    return IntegrationFlows.from("npEventPubSubChannel")

            .transform(...) 
            .transform(...)// should be transactional with above transform together
            .transform(...) // non transactional
            .handle((payload, headers) -> numbRepository.saveAll(payload))
            .get();

}

我找到了一种解决方法,即添加另一个句柄并将流引导到像这样的事务网关:

.handle("transactionalBean", "transactionalMetod") //Then implemented messagingGateway which consists of transactional method.

我还找到了中间流事务支持,但找不到可以处理的示例。

是否有一个优雅的解决方案,而不是直接指向流程中间的另一个网关?

4

1 回答 1

2

如果您想将两个转换器包装到事务中,除非将该调用隐藏在事务网关后面,否则您别无选择。当您使用原始 Java 时,这完全相似:

@Transactional
void myTransactionalMethod() {
    transform1();
    transform2();
}

我相信你同意我的观点,我们总是必须这样做才能让他们都在同一个交易中。

使用 Spring Integration Java DSL,您可以这样做:

.gateway(f -> f
            .transform(...)
            .transform(...),
        e -> e.transactional())

您是否同意它类似于我们使用原始 Java 所拥有的并且从优雅的角度来看并没有那么糟糕?

于 2017-10-11T14:14:33.767 回答