Каков наилучший способ для вызова нескольких параллельных API в Java?Я хочу сделать несколько вызовов покоя, объединить результаты и вернуть jsonArray.Я использую ExecutorService и получаю правильный вывод, когда я получаю доступ к URL только с одного клиентского ПК.Но когда я получаю доступ к URL-адресу от нескольких клиентов, каждый раз, когда я получаю jsonArray различного размера, даже если я вызываю один и тот же URL-адрес.
То, что я сделал, дано ниже:
ExecutorService executor = Executors.newFixedThreadPool(5);
resultArray = new JSONArray();
for (Branch branch : Branches) {
Future<Response> response = executor.submit(new Request(branch.getUrl(),
branch.getUserName(), branch.getPassword()));
responseBody = response.get().getResponseBody();
resultArray.put(responseBody);
}
executor.shutdown();
while(!executor.isTerminated()) {
}
return resultArray.toString();
public class Request implements Callable<Response> {
private HttpURLConnection con;
private URL obj;
private String response;
private String url;
private String username;
private String password;
public Request(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
@Override
public Response call() {
try {
obj = new URL(url);
con = (HttpURLConnection) obj.openConnection();
String userCredentials = username + ":" + password;
String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
con.setRequestProperty ("Authorization", basicAuth);
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
if(responseCode == 200) {
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer stringBuffer = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
stringBuffer.append(inputLine);
}
in.close();
response = stringBuffer.toString();
return new Response(responseCode, response);
}
else {
response = "{\"response\":\"some error occurred\"}";
return new Response(responseCode, response);
}
} catch (IOException e) {
response = "{\"output\":\"some error occurred\"}";
return new Response(404, response);
}
}
}
public class Response {
private String responseBody;
private int responseCode;
public Response(int responseCode, String responseBody) {
this.responseBody = responseBody;
this.responseCode = responseCode;
}
public int getResponseCode() {
return responseCode;
}
public String getResponseBody() {
return responseBody;
}
}