Di recente ho iniziato a sperimentare con RxJava e sono imbattuto in una presentazione da parte di un ingegnere di Netflix che ha suggerito lo spostamento nostre API di business per le API osservabile, per esempio:Qual è il modo corretto di gestire la transazione nei servizi RxJava?
public interface VideoService {
Observable<VideoBasicInfo> createVideoBasicInfo(VideoBasicInfo videoBasic);
Observable<VideoBasicInfo> getVideoBasicInfo(Integer videoId);
Observable<VideoRating> getVideoRating(Integer videoId);
}
Tuttavia non ho trovato alcun luogo che ha spiegato come transactionality dovrebbe essere gestito in questi servizi. In un primo momento ho appena annotato la mia implementazione del servizio con @Transactional
@Service
@Transactional
public class VideoServiceImpl implements VideoService{
@Autowired
private VideoBasicInfoRepository basicInfoRepo;
@Autowired
private VideoRatingRepository ratingRepo;
public Observable<VideoBasicInfo> createVideoBasicInfo(VideoBasicInfo videoBasic){
return Observable.create(s -> {
s.onNext(basicInfoRepo.save(videBasic));
});
}
Quello che vorremmo è che l'esecuzione di tutto il codice all'interno del Object.create
lambda (s -> { // This code }
) è accaduto in una transazione. Tuttavia , ciò che accade è che:
- La chiamata a
createVideoBasicInfo()
esegue in modo transazionale, restituendo l'osservabile freddo. - Il
save()
viene eseguito come una transazione atomica.
Ovviamente ha senso poiché il proxy Spring si applica ai metodi serviceImpl. Ho pensato di modi per fare quello che mi aspetto come l'avvio di una transazione programmatico:
return Observable.create(s -> {
VideoBasicInfo savedBasic = transactionTemplate.execute(status -> {
VideoBasicInfo basicInfo = basicInfoRepo.save(videoBasicInfo);
return basicInfo;
});
s.onNext(savedBasic);
});
È questo il modo consigliato di gestione delle operazioni quando si lavora con le API reattivi?
Qual è la vostra repository? È un'implementazione di Spring Data CrudRepository? Il CrudRepository ha un metodo "salva" contrassegnato come transazionale –
Senza contare che una volta che si utilizza Observables, un utente api può facilmente iscriversi o osservare su thread diversi, e le transazioni Sping e molti altri componenti si basano su un comportamento per thread, usando variabili locali del thread. Usare RxJava con le Transazioni di primavera complesse potrebbe rivelarsi complicato, ma ora che alla Spring 5 viene dato il supporto per Spring Reactor, vorrei imparare come dovrebbe funzionare anche questo. –