Web服务中的多线程

时间:2014-02-13 01:28:47

标签: java multithreading web-services

我在我的应用程序中使用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。

2 个答案:

答案 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;
  }