我有以下反應式存盤庫:
@Repository
public interface FooCosmosRepository extends ReactiveCosmosRepository<Foo, String> {
}
我使用它如下:
@Override
public Mono<FooResponse> getFooDetails() {
FooResponse fooResponse = new FooResponse();
fooResponse.setCount(1000);
List<Foo> fooList = new ArrayList<>();
repository.findAll().collectList().flatMap(e ->{
//This is not invoked. findAll return Flux<T> in this case Flux<Foo>
for (Foo foo : e) {
fooList.add(foo);
}
return null;
});
fooResponse.setFooList(fooList);
return Mono.just(fooResponse);
}
FooResponse 定義如下:
@NoArgsConstructor
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class FooResponse {
int rowCount;
List<Foo> fooList;
}
我無法阻止,因為我收到錯誤
Iterating over a toIterable() / toStream() is blocking, which is not supported in thread reactor-http-nio-6
我也無法Flux<T>從該方法回傳。我需要回傳Mono<FooResponse>。我如何查詢存盤庫,實際獲取/收集回應并添加到串列中?
有任何想法嗎?
uj5u.com熱心網友回復:
這是因為你是在命令式地而不是被動地編碼。并且您正在破壞鏈條,這意味著 Reactor 無法完成組裝階段,然后在訂閱階段執行。
@Override
public Mono<FooResponse> getFooDetails() {
return repository.findAll()
.collectList()
.map(list -> {
FooResponse fooResponse = new FooResponse();
fooResponse.setCount(1000);
fooResponse.setList(list);
return fooResponse;
});
}
這是基本反應堆,我推薦以下鏈接:
反應堆核心特點
助焊劑的飛行
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412173.html
標籤:
