簡體   English   中英

來自無限Java流的磁通端點

[英]Flux endpoint from infinite java stream

處理從Stream.generate構造構建的流量時遇到問題。

Java流正在從遠程源中獲取一些數據,因此我實現了一個自定義的供應商,該供應商嵌入了數據獲取邏輯,然后使用它來填充Stream。

Stream.generate(new SearchSupplier(...))

我的想法是檢測一個空列表並使用的Java9功能takeWhile - >

Stream.generate(new SearchSupplier(this, queryBody))
            .takeWhile(either -> either.isRight() && either.get().nonEmpty())

(使用Vavr的Either構造)

然后,存儲層通量將執行以下操作:

return Flux.fromStream (
            this.searchStream(...) //this is where the stream gets generated
        )
        .map(Either::get)
        .flatMap(Flux::fromIterable);

“服務”層由通量上的一些轉換步驟組成,但方法簽名類似於Flux<JsonObject> search(...)

最后,控制器層具有GetMapping:

@GetMapping(produces = "application/stream+json")
public Flux search(...) {
    return searchService.search(...) //this is the Flux<JsonObject> parth
         .subscriberContext(...) //stuff I need available during processing
         .doOnComplete(() -> log.debug("DONE")); 
}

我的問題是助焊劑似乎永遠不會終止。 例如,從Postman撥打電話只是在響應部分中拍攝了“正在加載...”部分。 當我從IDE中終止該過程時,結果將刷新到郵遞員,我看到了期望的結果。 而且doOnComplete lambda永遠不會被調用

我注意到的是,如果我改變助焊劑的來源:

Flux.fromArray(...) //harcoded array of lists of jsons

doOnComplete lambda被調用,並且http連接也關閉,結果顯示在郵遞員中。

知道可能是什么問題嗎?

謝謝。

您可以使用如下代碼直接創建Flux。 請注意,我要添加一些假定的方法,這些方法需要根據您的SearchSupplier的工作方式來實現:

Flux<SearchResultType> flux = Flux.generate(
            () -> new SearchSupplier(this, queryBody),
            (supplier, sink) -> {
                SearchResultType current = supplier.next();
                if (isNotLast(current)) {
                    sink.next(current);
                } else {
                    sink.complete();
                }
                return supplier;
            },
            supplier -> anyCleanupOperations(supplier)
        );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM