用请求上下文并行调用上游服务



我是spring web flux的新手。

我有一个不支持批处理调用的上游服务,因此我必须为数组中的每个对象多次调用它。我还需要请求参数的实例,因为服务不会在其响应中返回这些属性。

例如,这是我将发送给客户端的响应

class Person {
int id;
String name;
int phoneNo;
}

,我只有一个id列表

List<Integer> lstIds

对于每个人的api响应也是

{
"name": "name",
"phoneNo": 2222222222
}

请注意,响应中没有id字段,因此,我需要请求参数来映射请求与响应。

我有一个名为createRequestFromIdWillReturnMono(int id)的方法,它接受整数id并返回web客户端Mono作为响应。

我已经尽力了

List<Person> response = new ArrayList<Person>();
List<Integer> lstInt = IntStream.rangeClosed(0, 10).boxed().collect(Collectors.toList());
Flux
.fromIterable(lstInt)
.flatMap(i -> createRequestFromIdWillReturnMono(i)
.map(personResponse -> response.add(new Person(i, personResponse))));
return response; 

但是这段代码只运行响应。添加调用一次,即使它调用createRequestFromIdWillReturnMono 10次。

我该如何解决这个问题?

您不需要列表,您可以使用collectList并返回一个列表。或者您将Flux<Person>返回给客户端,这是一个流。

Mono<List<Persons>> personsMono = Flux.fromIterable(lstInt)
.flatMap(i -> createRequestFromIdWillReturnMono(i))
.map(personResponse -> new Person(i,personResponse))
.collectList();

就像这样,我现在不在电脑上,所以不能保证它能编译,但是你应该明白。

最新更新