为了账号安全,请及时绑定邮箱和手机立即绑定

弹簧通量和异步注释

弹簧通量和异步注释

茅侃侃 2022-08-17 16:49:35
我有一个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);}和处理器类:@Asyncvoid 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
查看完整描述

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();

}

如果发布者执行阻塞操作,则应在具有弹性或并行计划程序的其他线程上订阅该操作。


查看完整回答
反对 回复 2022-08-17
?
潇湘沐

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);

}


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信