Spring 数据 - webflux - 链接请求
Spring data - webflux - Chaining requests
我使用反应式 Mongo 驱动程序和 Web Flux 依赖项
我有如下代码。
public Mono<Employee> editEmployee(EmployeeEditRequest employeeEditRequest) {
return employeeRepository.findById(employeeEditRequest.getId())
.map(employee -> {
BeanUtils.copyProperties(employeeEditRequest, employee);
return employeeRepository.save(employee)
})
}
Employee Repository 有以下代码
Mono<Employee> findById(String employeeId)
调用 findById 时线程是否真的阻塞了?我了解 map 中的部分实际上阻塞了线程。
如果它阻塞,我怎样才能使这段代码完全反应?
此外,在这种编写代码的反应式范例中,我该如何处理找不到给定员工的情况?
是的,map 是一个阻塞和同步操作,所花费的时间始终是确定性的。
当你想对一个对象/数据进行固定时间的转换时,应该使用Map。同步完成的操作。例如你的 BeanUtils 复制属性操作。
FlatMap 应该用于非阻塞操作,或者简而言之 returns 支持 Mono、Flux 的任何东西。
“我如何处理找不到指定员工?” -
findById returns 未找到时为空单声道。所以我们可以在这里使用switchIfEmpty。
现在让我们来看看您可以对代码进行哪些更改:
public Mono<Employee> editEmployee(EmployeeEditRequest employeeEditRequest) {
return employeeRepository.findById(employeeEditRequest.getId())
.switchIfEmpty(Mono.defer(() -> {
//do something
}))
.map(employee -> {
BeanUtils.copyProperties(employeeEditRequest, employee);
return employee;
})
.flatMap(employee -> employeeRepository.save(employee));
}
我使用反应式 Mongo 驱动程序和 Web Flux 依赖项
我有如下代码。
public Mono<Employee> editEmployee(EmployeeEditRequest employeeEditRequest) {
return employeeRepository.findById(employeeEditRequest.getId())
.map(employee -> {
BeanUtils.copyProperties(employeeEditRequest, employee);
return employeeRepository.save(employee)
})
}
Employee Repository 有以下代码
Mono<Employee> findById(String employeeId)
调用 findById 时线程是否真的阻塞了?我了解 map 中的部分实际上阻塞了线程。
如果它阻塞,我怎样才能使这段代码完全反应?
此外,在这种编写代码的反应式范例中,我该如何处理找不到给定员工的情况?
是的,map 是一个阻塞和同步操作,所花费的时间始终是确定性的。
当你想对一个对象/数据进行固定时间的转换时,应该使用Map。同步完成的操作。例如你的 BeanUtils 复制属性操作。
FlatMap 应该用于非阻塞操作,或者简而言之 returns 支持 Mono、Flux 的任何东西。
“我如何处理找不到指定员工?” - findById returns 未找到时为空单声道。所以我们可以在这里使用switchIfEmpty。
现在让我们来看看您可以对代码进行哪些更改:
public Mono<Employee> editEmployee(EmployeeEditRequest employeeEditRequest) {
return employeeRepository.findById(employeeEditRequest.getId())
.switchIfEmpty(Mono.defer(() -> {
//do something
}))
.map(employee -> {
BeanUtils.copyProperties(employeeEditRequest, employee);
return employee;
})
.flatMap(employee -> employeeRepository.save(employee));
}