如何在调用 5 次后合并 webClient 调用的响应并将完整的响应保存在数据库中
how to merge the response of webClient call after calling 5 times and save the complete response in DB
我有这样的场景:
如果条目在数据库中可用,我必须检查 table 然后如果可用,我需要使用 webclient 调用相同的外部 api n 次,收集所有响应并将它们保存在数据库中。如果条目在数据库中不可用,则调用旧流程。
这是我的实现。需要改进它的建议。没有 for-each
public Mono<List<ResponseObject>> getdata(String id, Req obj) {
return isEntryInDB(id) //checking the entry in DB
.flatMap(
x -> {
final List<Mono<ResponseObject>> responseList = new ArrayList<>();
IntStream.range(0, obj.getQuantity()) // quantity decides how many times api call t happen
.forEach(
i -> {
Mono<ResponseObject> responseMono =
webClientCall(
id,
req.getType())
.map(
res ->
MapperForMappingDataToDesriedFormat(res));
responseList.add(responseMono);
});
return saveToDb(responseList);
})
.switchIfEmpty(oldFlow(id, req)); //if DB entry is not there take this existing flow.
需要一些建议来改进它而不使用 foreach。
在这种情况下,我会避免使用 IntStream,而是使用本地运算符来反应器称为 Flux。
您可以将 InsStream.range 替换为 Flux.range。像这样:
return isEntryPresent("123")
.flatMapMany(s -> Flux.range(0, obj.getQuantity())
.flatMap(this::callApi))
.collectList()
.flatMap(this::saveToDb)
.switchIfEmpty(Mono.defer(() ->oldFlow(id, req)));
private Mono<Object> saveToDb(List<String> stringList){
return Mono.just("done");
}
private Mono<String> callApi(int id) {
return Mono.just("iterating" + id);
}
private Mono<String> isEntryPresent(String id) {
return Mono.just("string");
}
我有这样的场景: 如果条目在数据库中可用,我必须检查 table 然后如果可用,我需要使用 webclient 调用相同的外部 api n 次,收集所有响应并将它们保存在数据库中。如果条目在数据库中不可用,则调用旧流程。
这是我的实现。需要改进它的建议。没有 for-each
public Mono<List<ResponseObject>> getdata(String id, Req obj) {
return isEntryInDB(id) //checking the entry in DB
.flatMap(
x -> {
final List<Mono<ResponseObject>> responseList = new ArrayList<>();
IntStream.range(0, obj.getQuantity()) // quantity decides how many times api call t happen
.forEach(
i -> {
Mono<ResponseObject> responseMono =
webClientCall(
id,
req.getType())
.map(
res ->
MapperForMappingDataToDesriedFormat(res));
responseList.add(responseMono);
});
return saveToDb(responseList);
})
.switchIfEmpty(oldFlow(id, req)); //if DB entry is not there take this existing flow.
需要一些建议来改进它而不使用 foreach。
在这种情况下,我会避免使用 IntStream,而是使用本地运算符来反应器称为 Flux。
您可以将 InsStream.range 替换为 Flux.range。像这样:
return isEntryPresent("123")
.flatMapMany(s -> Flux.range(0, obj.getQuantity())
.flatMap(this::callApi))
.collectList()
.flatMap(this::saveToDb)
.switchIfEmpty(Mono.defer(() ->oldFlow(id, req)));
private Mono<Object> saveToDb(List<String> stringList){
return Mono.just("done");
}
private Mono<String> callApi(int id) {
return Mono.just("iterating" + id);
}
private Mono<String> isEntryPresent(String id) {
return Mono.just("string");
}