Pra*_*bra 8 reactive-programming project-reactor reactive-streams spring-webflux
在 ProjectReactor 或 Reactive Streams 中,在您 subscribe() 之前不会发生任何事情。
除非有人订阅,否则响应式流数据流不会发生,但我看到所有 REST API(如查找、保存和插入)都没有显式调用订阅,但数据在生产者和订阅者之间流动。
@RestController
class PersonController {
private final PersonRepository repository;
public PersonController(PersonRepository repository) {
this.repository = repository;
}
@GetMapping("/all")
public Flux<Person> index() {
return repository.findAll();
}
@GetMapping("/people")
Flux<String> namesByLastname(@RequestParam Mono<String> lastname) {
Flux<Person> result = repository.findByLastname(lastname);
return result.map(it -> it.getFullName());
}
@PostMapping("/people")
Flux<People> AddPeople(@RequestBody Flux<Person> people) {
return repository.saveAll(people);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不需要调用REST 端点的订阅来启动 Project Reactor 中的数据流?
当我从浏览器调用时,REST 端点(HTTP 请求)如何自动订阅 Reactive Streams 以获取数据流?
我在这里错过了什么吗?
你是对的 - 当你的应用程序设置Flux/Mono反应式管道时,该管道中的任何内容都不会被执行,直到subscribe它执行某些操作。
以下是 Spring WebFlux 中请求/响应交换期间发生的情况:
Spring WebFlux 中最低的契约是HttpHandler——它是与底层服务器交互的契约。对于 Reactor Netty,该服务器已经支持反应式流 API,并且订阅是由服务器本地完成的。对于其他基于 Servlet 的服务器,我们使用到 Servlet 3.1 的反应式流桥。在 中ServletHttpHandlerAdapter,我们在反应式流世界和异步 I/O Servlet API 之间架起桥梁 - 订阅实际上发生在该桥梁内。
另外:请注意,我们通常不会subscribe使用 ; 返回的值WebClient。仅当您不在反应式管道中间(即不在控制器处理程序中间)时,您才能执行此操作。在这些情况下,我们通常将其插入管道中间的反应式运算符中;如果不这样做,您将无法保证何时收到 HTTP 客户端响应 - 这完全将该调用与应用程序的其余部分分离。
| 归档时间: |
|
| 查看次数: |
1417 次 |
| 最近记录: |