2

Je souhaite que la partie spécifique du flux soit transactionnelle. Par exemple, je veux faire les deux premières opérations de transformation en un bloc transactionnel. Voici le code de flux que j'utilise:Spring Integration DSL ajout d'une transaction mid flow

@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(); 

} 

J'ai trouvé une solution que l'ajout d'une autre poignée et diriger le flux vers la passerelle transactionnelle comme celui-ci:

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

J'ai aussi trouvé mid flow transactional support mais n'a pas pu trouver un exemple à travailler.

Existe-t-il une solution élégante plutôt que de se diriger vers une autre passerelle au milieu du flux?

Répondre

2

Si vous souhaitez intégrer deux transformateurs dans la transaction, vous n'avez pas le choix à moins de masquer cet appel derrière la passerelle transactionnelle. C'est tout à fait similaire lorsque vous faites Java brute:

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

Je suis sûr que vous êtes d'accord avec moi que nous avons toujours à faire de cette façon de les avoir à la fois dans la même transaction.

Avec DSL Spring Integration Java, vous pouvez le faire si:

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

-vous d'accord est similaire à ce que nous avons avec Java cru et pas si mal du point de vue de l'élégance?