- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近开始尝试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()
作为原子事务执行。 return Observable.create( s -> {
VideoBasicInfo savedBasic = transactionTemplate.execute( status -> {
VideoBasicInfo basicInfo = basicInfoRepo.save(videoBasicInfo);
return basicInfo;
});
s.onNext(savedBasic);
});
最佳答案
Spring Data JpaRepository方法签名已经标记为@Transactional,因此,如果仅使用一个,则无需执行任何特殊操作:
public interface PersonRepository extends JpaRepository<Person, Integer> {
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RepositoryConfiguration.class})
public class PersonRepositoryTest {
private PersonRepository personRepository;
@Autowired
public void setPersonRepository(PersonRepository PersonRepository) {
this.personRepository = PersonRepository;
}
@Test
public void testReactiveSavePerson() {
Person person = new Person("Jane", "Doe");
assertNull(person.getId()); //null before save
//save person
Observable.create(s -> {
s.onNext(personRepository.save(person));
}).subscribe();
//fetch from DB
Person fetchedPerson = personRepository.findOne(person.getId());
//should not be null
assertNotNull(fetchedPerson);
//should equal
assertEquals(person.getId(), fetchedPerson.getId());
assertEquals(person.getFirstName(), fetchedPerson.getFirstName());
}
}
@Component()
public class ObservableTxFactory {
public final <T> Observable<T> create(Observable.OnSubscribe<T> f) {
return new ObservableTx<>(this, f);
}
@Transactional
public void call(Observable.OnSubscribe onSubscribe, Subscriber subscriber) {
onSubscribe.call(subscriber);
}
private static class ObservableTx<T> extends Observable<T> {
public ObservableTx(ObservableTxFactory observableTxFactory, OnSubscribe<T> f) {
super(new OnSubscribeDecorator<>(observableTxFactory, f));
}
}
private static class OnSubscribeDecorator<T> implements Observable.OnSubscribe<T> {
private final ObservableTxFactory observableTxFactory;
private final Observable.OnSubscribe<T> onSubscribe;
OnSubscribeDecorator(final ObservableTxFactory observableTxFactory, final Observable.OnSubscribe<T> s) {
this.onSubscribe = s;
this.observableTxFactory = observableTxFactory;
}
@Override
public void call(Subscriber<? super T> subscriber) {
observableTxFactory.call(onSubscribe, subscriber);
}
}
}
@Bean
ObservableTxFactory observableTxFactory() {
return new ObservableTxFactory();
}
@Service
public class PersonService {
@Autowired
PersonRepository personRepository;
@Autowired
ObservableTxFactory observableTxFactory;
public Observable<Person> createPerson(String firstName, String lastName) {
return observableTxFactory.create(s -> {
Person p = new Person(firstName, lastName);
s.onNext(personRepository.save(p));
});
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {RepositoryConfiguration.class})
public class PersonServiceTest {
@Autowired
PersonRepository personRepository;
@Autowired
ObservableTxFactory observableTxFactory;
@Test
public void testPersonService() {
final PersonService service = new PersonService();
service.personRepository = personRepository;
service.observableTxFactory = observableTxFactory;
final Observable<Person> personObservable = service.createPerson("John", "Doe");
personObservable.subscribe();
//fetch from DB
final Person fetchedPerson = StreamSupport.stream(personRepository.findAll().spliterator(), false)
.filter(p -> p.getFirstName().equals("John") && p.getLastName().equals("Doe"))
.findFirst()
.get();
//should not be null
assertNotNull(fetchedPerson);
}
}
关于spring - 在RxJava Services中管理事务性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34250741/
有什么方法可以向 NSUserDefaults 添加事务性吗?我需要类似于数据库处理程序上众所周知的开始 - 提交 - 恢复功能,因此我可以在某些情况下恢复对用户默认值的修改。当然,该用户默认值的其他
我使用 SQL Azure 来存储 Blob 元数据,并使用 Azure Blob 存储来存储实际的 Blob。 Blob 创建/删除是通过在环境 TransactionScope 中登记这些操作来实
我正在使用 Google App Engine SDK 1.7.3 和 NDB 来访问数据存储区。 我应该如何从事务性tasklet 中运行非事务性tasklet? 我首先想到的是以下内容: @ndb
Spring Retry 是否保证与 Spring 的 @Transactional 注解一起工作? 具体来说,我正在尝试使用 @Retryable 进行乐观锁定。它似乎取决于所创建的 AOP 代理的
我正在尝试关注 Clean Architecture使用围棋。该应用程序是一个简单的图像管理应用程序。 我想知道如何最好地为我的存储库层设计接口(interface)。我不想将所有存储库方法组合到一个
考虑我有一个 Controller 方法 get()它调用了一些使用数据库的服务方法。 使整个 Controller 方法成为事务性还是每个服务方法是正确的? 在我看来,我们必须做 get()事务性,
背景: 我知道 this SO question关于事务性 NTFS (TxF) 和 this article描述如何使用它,但我正在寻找真实世界的经验,其中有大量的 blob 数据(例如文档和/或照
遵循 this question 的建议,我正在使用 to_regclass 函数来检查表是否存在,如果不存在则创建它。但是,如果表是在当前事务中创建的,to_regclass 似乎仍会返回 null
同时向 Neo4J's transactional Cypher API 发送 Cypher 查询,我遇到了以下错误: Neo.ClientError.Request.InvalidFormat Un
持续交付 我正在为关系存储构建一个带有 MySQL 数据库的应用程序。应用程序被设计为持续交付,为此,应用程序数据库必须就地升级。 基本方法 1. Application -> Transaction
我需要通过 SCP 将同一个文件以事务方式发送到多个服务器。它将覆盖文件的先前版本。我需要保证每台服务器都有新文件,或者每台服务器都有旧文件。服务器暂时处于中间状态是可以接受的,只要它以一致的状态结束
我有一个 C++ 应用程序,其内存数据集由一组对象组成,每个对象都附加了一个键/值集。对象和键由 int id 引用,值始终是单个类的实例。键 ID 在一个对象中是唯一的,对象 ID 在整个宇宙中是唯
假设有一个服务组件,使用 Book 实体的 CrudRepository。假设服务的方法之一应该是事务性的,并且应该(除其他外)使用事务性语义从数据库中删除一个实体(即,如果无法执行删除,则应回滚所有
我在 REST 接口(interface)中注入(inject)了 @RequestScoped、@Transactional CDI bean: @RequestScoped @Transactio
我正在寻找一些建议以最好地执行此要求: 我需要调用 3 或 4 个单独的 API/端点来将用户添加到我们的系统(使用表单)。 第一个调用添加一个用户帐户并返回一个 ID。 第二个使用不同的端点创建联系
我正在尝试使用JPATransactionManager运行camel transacted()路由(一个独立的java进程),JPATransactionManager是spring Platfor
这是在应用程序引擎中 transaction docs ... Note: If your application receives an exception when committing a tr
我正在寻找在 Neo4j 2.2.x 上使用 JQuery 创建 REST POST 请求的代码示例 Transactional Cypher HTTP endpoint与新REST API Auth
我是一名优秀的程序员,十分优秀!