2 回答
TA贡献2041条经验 获得超4个赞
如果你正在寻找“一劳永逸”模式的实现,你可以订阅你的发布者
@PostMapping("/create")
public Mono<Resource> create(@Valid @RequestBody Resource r) {
run(r).subscribe();
return repository.save(r);
}
Mono<Void> run(Resource r) {
WebClient webClient = WebClient.create("http://localhost:8080");
return webClient.get()
.retrieve()
.bodyToMono(String.class)
.then();
}
如果发布者执行阻塞操作,则应在具有弹性或并行计划程序的其他线程上订阅该操作。
TA贡献1816条经验 获得超6个赞
我做了一些测试,我认为即使使用fire and forget也会等待请求完成,然后再将答案返回给web浏览器或REST客户端(至少在我的简单测试中,它看起来像这样)。因此,您必须执行与@Async类似的操作,创建另一个线程:subscribe()
@PostMapping("/create")
public Mono<Resource> create(@Valid @RequestBody Resource r) {
return processor.run(r)
.subscribeOn(Schedulers.elastic()) // put eveything above this line on another thread
.doOnNext(string -> repository.save(r)); // persist "r", not changing it, though
}
和处理器类:
Mono<String> run(Resource r) {
WebClient webClient = WebClient.create("http://localhost:8080");
return webClient.get()
.retrieve()
.bodyToMono(String.class);
}
添加回答
举报