【发布时间】:2018-11-20 13:07:50
【问题描述】:
在 ProjectReactor 或 Reactive Streams 中,在您订阅()之前什么都不会发生。
除非有人订阅,否则反应式流数据流不会发生,但我看到所有 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);
}
}
为什么我们不需要为 REST Endpoints 调用 subscribe 来启动 Project Reactor 中的数据流?
当我从浏览器调用时,REST 端点(HTTP 请求)如何自动订阅 Reactive Streams 以获取数据流?
我错过了什么吗?
【问题讨论】:
-
反应流就是这样工作的。您需要订阅。这有点像说为什么我需要连接到我的数据库才能运行查询。
-
@Enigmativity 他的问题有点不同。他要问的是(至少我相信如此)当我通过 Java 代码使用 Webclient 调用休息端点时,我需要使用 subscribe(),但是当我从浏览器调用这些休息端点时,它是如何自动订阅的。这是一个公平的问题。
-
@pvpkiran,你是对的。让我换个问题。
-
@PrabuSubra spring web-flux 在 http 服务器上工作,如果您使用 spring-boot,默认情况下它将是 http 服务器“Netty”。 Http 服务器处理传入的 http 请求并订阅具体的发布者。
标签: reactive-programming spring-webflux project-reactor reactive-streams