Redis
 sql >> Baza danych >  >> NoSQL >> Redis

używanie Async wewnątrz transakcji w aplikacji Spring

Odpowiedź od M. Deinum jest dobra, ale jest jeszcze inny sposób na osiągnięcie tego, który może być dla Ciebie prostszy, w zależności od stanu Twojej aktualnej aplikacji.

Możesz po prostu zawinąć wywołanie metody asynchronicznej w zdarzeniu, które zostanie przetworzone po zatwierdzeniu bieżącej transakcji, aby za każdym razem poprawnie odczytywać zaktualizowaną jednostkę z bazy danych.

Jest to dość proste, pokażę ci:

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

Zasadniczo dzieje się tutaj, że dostarczamy implementację dla wywołania zwrotnego bieżącej transakcji i zastępujemy tylko metodę afterCommit - są tam inne metody, które mogą być przydatne, sprawdź je. Aby uniknąć wpisywania tego samego standardowego kodu, jeśli chcesz użyć tego w innych częściach lub po prostu uczynić metodę bardziej czytelną, wyodrębniłem go w metodzie pomocniczej.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sidekiq nie znajduje rekordów dla Rails Active Job

  2. Pula połączeń Node.js Redis

  3. Django Celery otrzymuje liczbę zadań

  4. Najlepszy sposób na przechowywanie kluczy redis

  5. Zduplikuj klucz w redis