繁体   English   中英

我可以在 Flux.generate 状态生成器中阻止远程调用吗

[英]Can I have blocking remote call in Flux.generate state generator

我正在从一系列阻塞的 REST API 调用中生成 Flux,每次调用都取决于上一次调用的结果。 IE

Result r1 = call(fromRow = 0);
Result r2 = call(fromRow = 0 + r1.size());
Result r3 = call(fromRow = 0 + r1.size() + r2.size());
...

这是我正在尝试的简化版本:

Flux.generate(() -> 0, (i, sink) -> {
    Result r = slowRemoteCall(i);
    if (r == null) {
        sink.complete();
    } else {
        sink.next(r)
    }
    return i + r.size();
}, state -> {});

只是想知道状态生成器内部的阻塞调用slowRemoteCall会成为问题吗?

提前谢谢你的帮助!

使用expand运算符和反应式远程客户端(例如:Spring WebClient),您可以以反应式非阻塞方式实现:

slowRemoteCall(0)
        .expand(result -> {
            if (result.size() == 0) { // stop condition
                return Mono.empty();
            } else {
                return slowRemoteCall(result.startIndex() + result.size()); // maintain state
            }
        })

Mono<Result> slowRemoteCall(int startIndex) {
    // simulate latency (could be a WebClient call here)
    return Mono.delay(Duration.ofMillis(200)).thenReturn(new Result(startIndex));
}

灵感来自这篇博文

它可能会成为一个问题! 如果您有任何阻塞调用,您可以使用schedulers来让特定线程池完成任务。

Flux.generate(.........)
    .subscribeOn(Schedulers.boundedElastic())

更多信息:

https://www.vinsguru.com/reactive-programming-schedulers/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM