Redis
 sql >> Database >  >> NoSQL >> Redis

utilizzando Async all'interno di una transazione nell'applicazione Spring

La risposta di M. Deinum è buona, ma c'è ancora un altro modo per raggiungere questo obiettivo che potrebbe essere più semplice per il tuo caso, a seconda dello stato della tua attuale applicazione.

Potresti semplicemente avvolgere la chiamata al metodo asincrono in un evento che verrà elaborato dopo il commit della transazione corrente in modo da leggere correttamente l'entità aggiornata dal db ogni volta.

È abbastanza semplice farlo, lascia che te lo mostri:

import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

 @Transactional
public void doSomething() {

    // application code here

    // this code will still execute async - but only after the
    // outer transaction that surrounds this lambda is completed.
    executeAfterTransactionCommits(() -> theOtherServiceWithAsyncMethod.doIt());

    // more business logic here in the same transaction
}

private void executeAfterTransactionCommits(Runnable task) {
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
        public void afterCommit() {
            task.run();
        }
    });
}

Fondamentalmente ciò che accade qui è che forniamo un'implementazione per il callback della transazione corrente e sovrascriviamo solo il metodo afterCommit:ci sono altri metodi che potrebbero essere utili, controllali. E per evitare di digitare lo stesso codice boilerplate se vuoi usarlo in altre parti o semplicemente rendere il metodo più leggibile, l'ho estratto in un metodo helper.