我们遇到了以下行为,但我们希望知道它是否是预期的,以及是否有兴趣将它记录为一些有种陷阱。春季数据MongoDB save()结果双重插入
我们与春天启动2 /春WebFlux试验和设置了一个小的应用程序,主要有这样的事情(所有缩短):
@PostMapping
public Mono<Todo> addTodos(@RequestBody Person person) {
return personService.addPerson(person);
}
服务第一这个样子,因为我们希望还出版人另外的事件到消息队列:
public class PersonService {
public Mono<Person> addPerson(Person person) {
Mono<Person> addedPerson = personRepository.save(person);
addedPerson.subscribe(p -> rabbitTemplate.convertAndSend("persons", p));
return addedPerson;
}
}
所以,这显然是错误的,那样做。 .subscribe()
触发流程,我们假设反应REST控制器在序列化响应数据之前在后台执行相同操作,从而产生第二个并行流程。最后,我们在数据库中的persons
集合中结束了两个重复条目。
经过这么长时间的介绍后,终于提出了这样一个问题:这是多个用户触发多个插入的预期行为(基本上,如果您订阅n
次,您将得到n
插入)?
如果是,这可能是初学者需要强调的一个陷阱,特别是如果我们的理解是正确的,那么反应式REST控制器会在屏幕下执行.subscribe()
。
非常感谢那精心设计的答案!我的关键是“如果你调用'subscribe()''你应该有一个很好的理由”。我并不是全新的反应式编程,但项目反应器中的术语和最佳实践对我来说是全新的。 也感谢操作员概述!不知怎的,错过了。 –