Acompanhe os novos blogs no site www.byiorio.com.br
package br.com.byiorio.performance_test.infra;
import java.util.concurrent.ForkJoinPool;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ForkJoinConfig {
@Value("${server.parallelism:200}")
private String parallelism;
@Bean
public ForkJoinPool getForkJoinPool() {
return new ForkJoinPool(Integer.valueOf(parallelism));
}
}
Dentro do nosso @Service vamos criar o nosso ForkJoinPool.
@Autowired
ForkJoinPool forkJoinPool;
Vamos usar o CompletableFuture.supplyAsync() para solicitar a execução da chamada do Feign em paralelo
CompletableFuture<CardResponse> cardinfo = CompletableFuture.supplyAsync(() -> feignCardClient.getCard(accountNumber), forkJoinPool);
Agora vamos usar o método .get() para pegar o resultado, o método completo ficaria assim:
public BalanceResponse usandoFeignCompletableFuture(Integer accountNumber) throws InterruptedException, ExecutionException {
BalanceResponse balanceResponse = new BalanceResponse();
//Faz a primeira chamada
CompletableFuture<CardResponse> cardinfo = CompletableFuture.supplyAsync(() -> feignCardClient.getCard(accountNumber), forkJoinPool);
//Faz a segunda chamada
CompletableFuture<StatusResponse> statusInfo = CompletableFuture.supplyAsync(() -> feignStatusClient.getStatus(accountNumber), forkJoinPool);
//Juntando as respostas
balanceResponse.setCardNumber(cardinfo.get().getCardNumber());
balanceResponse.setStatus(statusInfo.get().getCode());
// Adiciona o balance
balanceResponse.setBalance(getBalance(accountNumber));
return balanceResponse;
}
Com o uso das Threads o processo em paralelo pode ser executado chegando na mesma performance do WebCliente conforme mostrado no vídeo.
feign client; performance; teste;