我在我的应用程序中使用webservices,但我面临以下性能(巨大的时间tsking)问题。 在旅行领域应用程序上工作。搜索旅行服务。 我正在寻找航班,酒店,汽车和外汇服务,
航班服务包含3个网络服务 1.galileo,Ezeego和makemy trip webservices(消耗15秒才能得到回复)
酒店服务包含3个网络服务 1.galileo,Hotelspro和Bookings.com webservices(需要25秒才能得到回复)
汽车服务包含3个网络服务 1.cartrwaler webservices(消耗15秒以获得响应)
完全需要60秒才能获得所有服务的全部响应。
我正在按顺序使用JAVA编程我正在使用api。 任何人都可以建议我如何通过使用javatechnology减少性能时间(5秒)。
我认为多线程是可行的方法,但在多线程中我必须使用哪个概念,请给我一个guilde。
答案 0 :(得分:0)
使用ExecutorService
提交任务以在独立线程中调用各种Web服务,然后等待返回的Future
得到结果。
答案 1 :(得分:0)
我会做以下事情:
请记住,ClosableHttpAsyncClient有一堆你可以调整它的玩具。 我会阅读HttpClient的文档和可关闭的文档。
这也允许您将池化连接管理器与其他3个服务一起使用,并将客户端传递给每个服务,使其保留单例。这使您可以在一个地方配置和微调所有这些客户端,并以异步方式提供数据。
public class FlightService {
CloseableHttpAsyncClient httpClient;
public FlightService(CloseableHttpAsyncClient httpClient){
this.httpClient = httpClient;
}
public static class FlightInfo{
private Map<String, String> airlineDataForService1;
private Map<String, String> airlineDataForService2;
private Map<String, String> airlineDataForService3;
FlightInfo(HttpResponse service1, HttpResponse Service2, HttpResponse service3){
//do stuff with data here
}
}
public FlightInfo getFlightInfo(){
return new FlightInfo(callFlightService1().get(), callFlightService2().get(), callFlightService3().get());
}
private Future<HttpResponse> callFlightService1(){
return callService("flightService1.com");
}
private Future<HttpResponse> callFlightService2(){
return callService("flightService2.com");
}
private Future<HttpResponse> callFlightService3(){
return callService("flightService3.com");
}
private Future<HttpResponse> callService(String serviceUrl){
try{
HttpGet request = new HttpGet(serviceUrl);
httpClient.open();
return httpClient.execute(request, null);
} catch (InterruptedException e) {
//handle retries here
} catch (ExecutionException e) {
//throw 500 here
} finally {
try {
httpClient.close();
} catch (IOException e) {
// throw 500
}
}
return null;
}