Eu estou escrevendo um código que escolhe os vários detalhes da chamada API de um arquivo e executa aquelas por um e fornece os dados de resposta em um ArrayList. Abaixo está o meu código atual.
ArrayList<APICallDetails> apiCallDetailsArray = new ArrayList<>();
APICallDetails apiCallDetails = new APICallDetails();
for (count= 1; count <= callsCount; count++){
try{
apiCallDetails = new APICallDetails();
apiCallDetails.setName(property.getPropertyReader(callName+"_"+count+"_Name", propsFile));
apiCallDetails.setHost(marketConfigs.getRawJson().get(property.getPropertyReader(callName+"_"+count+"_Host", propsFile)).toString().replaceAll("\"", ""));
apiCallDetails.setPath(property.getPropertyReader(callName+"_"+count+"_Path", propsFile));
apiCallDetails.setMethod(property.getPropertyReader(callName+"_"+count+"_Method", propsFile));
apiCallDetails.setBody(property.getPropertyReader(callName+"_"+count+"_Body", propsFile));
apiCallDetails = sendAPIRequest.mwRequestWithoutBody(apiCallDetails, marketConfigs);
BufferedWriter out = null;
try {
out = new BufferedWriter ( new FileWriter ( "C:\\file"+count+".html"));
out.write("something");
out.close();
} catch (IOException e) {
e.printStackTrace();
logger.error(new Date()+" - Error in "+getClass()+".apiCallRequester() flow: "+e.toString());
}
apiCallDetailsArray.add(apiCallDetails);
}catch(NullPointerException e){
e.printStackTrace();
logger.error(new Date()+" - Error in "+getClass()+".apiCallRequester() flow: "+e.toString());
}
}
Como há mais chamadas de API, isso está tomando a soma do tempo de resposta de todas as chamadas. Quero essas chamadas para executar em paralelo e armazenar os dados de resposta em um ArrayList que eu posso usar mais. Eu sou novo para Java assim, alguém por favor pode me ajudar com isso?
Você pode usar fluxos paralelos. O seguinte invocação irá invocar em paralelo createAPICallDetails(idx)
e adicionar seus objetos de retorno em um List
:
List<APICallDetails> result = IntStream.range(0, callsCount)
.parallel()
.mapToObj(idx -> createAPICallDetails(idx))
.collect(Collectors.toList());
Assim, a única coisa que resta para você é para implementar a lógica de:
APICallDetails createAPICallDetails(int index) { ... }
Para criar um único objeto do seu APICallDetails
dado o index
argumento, para que possa ser usado no lambda anterior.
Espero que isto ajude.