仅在需要时在反应堆通量中请求下一个

时间:2019-09-18 17:55:56

标签: java spring spring-webflux project-reactor

我有一个API,该API返回的实体列表最多为100个。如果还有更多实体,则返回下一页的令牌。

我想创建一个返回(所有页面中的)所有实体但仅在需要时(如果需要)返回的通量。

我写了这段代码:

class Page {
    String token;
    List<Object> entities;
}

Flux<Object> load(String token, final Function<String, Mono<Page>> fct) {
    return fct.apply(token).flatMapMany(page -> {
        if (page.token == null) {
            // no more pages
            return Flux.fromIterable(page.entities);
        }

        return Flux.fromIterable(page.entities).concatWith(Flux.defer(() -> load(page.token, fct)));
    });
}

它有效-几乎

如果我请求99个元素,则会加载第一页,并且我的磁通包含99个元素。

如果我请求150个元素,则会加载第一页和第二页,并且我的流量中包含150个元素。

但是,如果我请求100个元素,则会加载第一页和第二页(并且我的磁通包含100个元素)。我的问题是,第二个页面已加载到我没有请求第101个元素的地方。

当前行为:

subscribe()
=> Function is called to load page 1
request(10)
=> Received: 0-9
request(89)
=> Received: 10-98
request(1)
=> Received: 99
=> Function is called to load page 2
request(1)
=> Received: 100

预计是:第2页的加载发生在最后一个请求(1)

之后

几乎就像在某些地方预取了一样,但是我看不到哪里。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好,我找到了。每次都没有预取。实际上,<rewrite> <rules> <rule name="Redirect to http" enabled="true" patternSyntax="Wildcard" stopProcessing="true"> <match url="*" negate="false" /> <conditions logicalGrouping="MatchAny"> <add input="{HTTPS}" pattern="off" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Found" /> </rule> </rules> </rewrite> 会在订阅而非请求时加载下一页。

快速(较脏)的测试可修复以下问题:

Flux.defer