Was ist die korrekte Art der Transaktionsverwaltung in RxJava Services?

8

Ich habe vor kurzem begonnen, mit RxJava zu experimentieren und stieß dabei auf eine Präsentation eines Netflix-Technikers, der vorgeschlagen hat, unsere Business-APIs auf Observable APIs zu verschieben, zum Beispiel:

%Vor%

Ich habe jedoch keinen Ort gefunden, der erklärt, wie die Transaktionen in diesen Diensten verwaltet werden sollten. Zuerst habe ich nur meine Service-Implementierung mit @Transactional

kommentiert %Vor%

Was wir wollen, ist, dass die Ausführung des gesamten Codes in Object.create lambda ( s -> { // This code } ) in einer Transaktion erfolgt. JEDOCH , was tatsächlich passiert, ist Folgendes:

  1. Der Aufruf von createVideoBasicInfo() wird auf transaktionale Weise ausgeführt und gibt die kalte beobachtbare Variable zurück.
  2. Das save() wird als atomare Transaktion ausgeführt.

Offensichtlich ist dies sinnvoll, da der Spring-Proxy für die serviceImpl-Methoden gilt. Ich habe über Möglichkeiten nachgedacht, was ich wirklich erwarte, wie zum Beispiel eine programmatische Transaktion zu starten:

%Vor%

Ist dies die empfohlene Methode zum Verwalten von Transaktionen beim Arbeiten mit reaktiven APIs?

    
codependent 13.12.2015, 11:48
quelle

2 Antworten

7

Spring Data JpaRepository-Methodensignaturen sind bereits mit @Transactional gekennzeichnet. Wenn Sie also nur einen verwenden, müssen Sie nichts Besonderes tun:

%Vor% %Vor%

Wenn Sie mehrere Repositories in einer Transaktion kombinieren müssen, könnten Sie etwas wie die folgende Klasse verwenden:

%Vor%

Die Factory-Bean muss ebenfalls definiert werden:

%Vor%

Service:

%Vor%

Test:

%Vor%

Screenshot zeigt den Proxy:

    
John Scattergood 15.12.2015, 19:00
quelle
0

Ich würde gerne auf John Scattergood eine hervorragende Antwort geben. Meine typische Verwendung ist mit Observable.fromCallable() , also habe ich nach einer Möglichkeit gesucht, dies zu tun, anstatt Observable.OnSubscribe zu implementieren, also habe ich seine Technik so angepasst, dass Sie sie verwenden können, indem Sie Callable

übergeben

Fabrikklasse:

%Vor%

Ursprünglicher Code:

%Vor%

Neuer Code:

%Vor%

Stellen Sie sicher, dass die Methode, der Sie @Transactional hinzufügen, public ist, andernfalls kann Spring AOP dies nicht mitteilen

    
timcheng09 19.05.2016 21:25
quelle