【发布时间】:2016-03-18 23:19:47
【问题描述】:
我最近开始尝试使用 RxJava,并看到一位 Netflix 工程师的演示文稿,其中建议将我们的业务 API 迁移到 Observable API,例如:
public interface VideoService {
Observable<VideoBasicInfo> createVideoBasicInfo(VideoBasicInfo videoBasic);
Observable<VideoBasicInfo> getVideoBasicInfo(Integer videoId);
Observable<VideoRating> getVideoRating(Integer videoId);
}
但是,我还没有找到解释如何在此服务中管理事务性的任何地方。一开始我只是用@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));
});
}
我们想要的是,Object.create lambda (s -> { // This code }) 中的所有代码的执行都发生在一个事务中。 然而,实际发生的是:
- 对
createVideoBasicInfo()的调用以事务方式执行,返回冷可观察对象。 -
save()作为原子事务执行。
显然这是有道理的,因为 Spring 代理适用于 serviceImpl 方法。我已经想到了一些方法来做我真正期望的事情,比如开始一个程序化事务:
return Observable.create( s -> {
VideoBasicInfo savedBasic = transactionTemplate.execute( status -> {
VideoBasicInfo basicInfo = basicInfoRepo.save(videoBasicInfo);
return basicInfo;
});
s.onNext(savedBasic);
});
在使用响应式 API 时,这是管理事务的推荐方式吗?
【问题讨论】:
-
你的存储库是什么?它是 Spring Data CrudRepository 的实现吗? CrudRepository 有一个标记为事务性的“保存”方法
-
更不用说一旦你使用了 Observables,一个 api 用户可以很容易地订阅或观察不同的线程,并且 Sping 事务和许多其他组件依赖于每个线程的行为,使用线程局部变量。将 RxJava 与复杂的 Spring 事务一起使用可能会很复杂,但现在 Spring 5 支持 Spring Reactor,我也想了解它应该如何工作。
标签: spring reactive-programming rx-java rx-android netflix