弹簧通量和异步注释

我有一个Spring Flux应用程序,在某些时候我需要在后台执行一些繁重的任务,调用方(HTTP请求)不需要等到该任务完成。


如果没有反应器,我可能会使用异步注释,在不同的线程上执行该方法。对于反应堆,我不确定我是否应该继续这种方法,或者是否已经有一个内置的机制允许我实现这一目标。


例如,给定一个接受 Resource 对象的控制器:


@PostMapping("/create")

public Mono<Resource> create(@Valid @RequestBody Resource r) {

    processor.run(r); // the caller should not wait for the resource to be processed

    return repository.save(r);

}

和处理器类:


@Async

void run(Resource r) { 

    WebClient webClient = WebClient.create("http://localhost:8080");

    Mono<String> result = webClient.get()

                                   .retrieve()

                                   .bodyToMono(String.class);

    String response = result.block(); //block for now

}

的 HTTP 调用方不需要等到方法完成。/createrun


茅侃侃
浏览 85回答 2
2回答

缥缈止盈

如果你正在寻找“一劳永逸”模式的实现,你可以订阅你的发布者@PostMapping("/create")public Mono<Resource> create(@Valid @RequestBody Resource r) {&nbsp; &nbsp; run(r).subscribe();&nbsp; &nbsp; return repository.save(r);}Mono<Void> run(Resource r) {&nbsp; &nbsp; WebClient webClient = WebClient.create("http://localhost:8080");&nbsp; &nbsp; return webClient.get()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .retrieve()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .bodyToMono(String.class)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .then();}如果发布者执行阻塞操作,则应在具有弹性或并行计划程序的其他线程上订阅该操作。

潇湘沐

我做了一些测试,我认为即使使用fire and forget也会等待请求完成,然后再将答案返回给web浏览器或REST客户端(至少在我的简单测试中,它看起来像这样)。因此,您必须执行与@Async类似的操作,创建另一个线程:subscribe()@PostMapping("/create")public Mono<Resource> create(@Valid @RequestBody Resource r) {&nbsp; &nbsp; return processor.run(r)&nbsp; &nbsp; .subscribeOn(Schedulers.elastic()) // put eveything above this line on another thread&nbsp; &nbsp; .doOnNext(string -> repository.save(r)); // persist "r", not changing it, though}和处理器类:Mono<String> run(Resource r) {&nbsp;&nbsp; &nbsp; WebClient webClient = WebClient.create("http://localhost:8080");&nbsp; &nbsp; return webClient.get()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.retrieve()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.bodyToMono(String.class);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java