[英]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.