Bonjour,
j'ai un peu avancé sur le sujet mais je suis toujours bloqué...
J'ai créé des services pour récupérer les données avec WebClient
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
@Service
public class OperationClient {
private final WebClient webClient;
public OperationClient(WebClient.Builder builder) {
this.webClient = builder.baseUrl("lb://operation-query-microservice/operation/").build();
}
public Mono<OperationFullDto> getOperation(String operationId){
return webClient
.get()
.uri("{id}" , operationId)
.retrieve()
.bodyToMono(OperationFullDto.class)
.onErrorResume(ex->Mono.empty());
}
} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
@Service
public class OuvrageClient {
private final WebClient webClient;
public OuvrageClient(WebClient.Builder builder) {
this.webClient = builder.baseUrl("lb://ouvrage-microservice/ouvrage/").build();
}
public Mono<List<OuvrageDto>> getOuvrages(List<Long> ids){
return webClient
.get()
.uri("{ids}",ids)
.retrieve()
.bodyToFlux(OuvrageDto.class)
.collectList()
.onErrorReturn(Collections.emptyList());
}
} |
le service suivant permet de combiner le résultat des deux autres services :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
@Service
@AllArgsConstructor
public class CombinedOperationService {
private final OperationClient operationClient;
private final OuvrageClient ouvrageClient;
public Mono<OperationDetailDto> getDetails(String operationId){
Mono<OperationFullDto> operationMono = operationClient.getOperation(operationId);
// uniquement pour le test.... le temps de trouver comment récupérer
// la liste des ouvrages dans le operationMono avant de lancer la méthode getOuvrage
List<Long> listDeTest = new ArrayList<>();
listDeTest.add(1L);
listDeTest.add(2L);
Mono<List<OuvrageDto>> ouvragesMono = ouvrageClient.getOuvrages(listDeTest);
return Mono.zip(
operationMono,
ouvragesMono
)
.map(this::combine);
}
private OperationDetailDto combine (Tuple2<OperationFullDto, List<OuvrageDto>> tuple){
return OperationDetailDto.create(
tuple.getT1(),
tuple.getT2()
);
}
} |
1) Comment puis-je attendre le résultat du premier service (OperationClient) afin de récupérer la List des ouvrages et l'injecter dans les paramètre du second service (OuvrageClient) ?
j'ai essayé de faire un .block() mais j'ai un
java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-3
2) Puis-je utiliser la méthode zip pour combiner un Mono() et un Flux() ? Actuellement mon service (OuvrageClient) retourne un Mono.... Mon publisher (lb//ouvrage-microservice/ouvrage/) remonte un Flux d'ouvrage
D'avance merci pour votre aide
Partager