Spring Integration DSL добавляет транзакцию среднего потока

Я хочу сделать конкретную часть потока транзакционной. Например, я хочу выполнить первые две операции преобразования в одном транзакционном блоке. Вот код, который я использую:

@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.

Я также нашел промежуточная поддержка транзакций, но не смог найти пример для работы.

Есть ли более элегантное решение вместо перехода к другому шлюзу в середине потока?




Ответы (1)


Если вы хотите заключить в транзакцию два трансформатора, у вас нет выбора, кроме как скрыть этот вызов за транзакционным шлюзом. Это полностью похоже на чистую Java:

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

Я уверен, что вы согласны со мной в том, что мы всегда должны использовать этот способ, чтобы они оба участвовали в одной транзакции.

С Spring Integration Java DSL вы можете сделать это, хотя:

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

Согласны ли вы, что это похоже на то, что мы имеем с необработанной Java, и не так уж плохо с точки зрения элегантности?

person Artem Bilan    schedule 11.10.2017