Я думаю, что это должно работать.
Сначала выбираем художников и отображаем ответ. Во время картирования мы берем обложку каждого альбома и получаем List<Mono<Cover>>
бок.
Затем мы объединяем их в Flux#merge
, который будет излучать каждый Cover
, когда они будут доступны. Таким образом, мы можем затем на каждом излучении doOnNext
и прикрепить их к исполнителю.
Когда это будет сделано, мы просто then
и возвращаем объект Artist.
После этой цепочки событий мы можем doOnSuccess
наш второй выбор и добавить дополнительную информацию к объекту Artist
.
public Mono<Artist> getArtistInfo(String id) {
return webClient.get()
.uri("/artist")
.retrieve()
.bodyToMono(ArtistResponse.class)
.flatMap(artistResponse -> {
final Artist artist = new Artist();
return Flux.fromIterable(artistResponse.getAlbums())
.parallel(2)
.runOn(Schedulers.parallel())
.map(albums -> webClient.get()
.uri("artist/albums")
.retrieve()
.bodyToMono(Covers.class))
.doOnNext(coversMono -> coversMono
.doOnSuccess(covers -> artist.getAlbums().add(covers)))
.thenReturn(artist);
})
.doOnSuccess(artist -> webClient.get()
.uri("/artist/profile")
.retrieve()
.bodyToMono(Profiles.class)
.doOnSuccess(profiles -> artist.setDescription(profiles.getDescription())));
}
Не запускал код, поэтому не могу гарантировать его, но, по крайней мере, он даст вам некоторое понимание и, возможно, шаг вперед.