sql >> Database >  >> NoSQL >> Redis

Async gebruiken in een transactie in de Spring-toepassing

Het antwoord van M. Deinum is goed, maar er is nog een andere manier om dit te bereiken die voor u eenvoudiger kan zijn, afhankelijk van de staat van uw huidige aanvraag.

Je zou de aanroep eenvoudig naar de async-methode kunnen omwikkelen in een gebeurtenis die wordt verwerkt nadat je huidige transactie is vastgelegd, zodat je de bijgewerkte entiteit elke keer correct uit de db leest.

Het is vrij eenvoudig om dit te doen, ik zal het je laten zien:

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

Wat hier in feite gebeurt, is dat we een implementatie leveren voor de huidige transactie-callback en dat we alleen de afterCommit-methode overschrijven - er zijn andere methoden die nuttig kunnen zijn, bekijk ze eens. En om te voorkomen dat je dezelfde standaardcode moet typen als je dit in andere delen wilt gebruiken of de methode gewoon leesbaarder wilt maken, heb ik dat in een hulpmethode geëxtraheerd.



  1. Voorbeelden bij het gebruik van RedisStore in socket.io

  2. Lua-script voor Redis dat de waarden van sleutels optelt

  3. Mongodb, geaggregeerde zoekopdracht met $lookup

  4. Moet ik de optie allowDiskUse gebruiken in een productomgeving?