2014-02-13 47 views
1

我在我的應用程序中使用webservices,但我面臨以下性能(巨大時間tsking)問題。 在旅行域應用程序上工作,搜索旅行服務。 我搜索機票,酒店,租車和外匯服務,webservices中的多線程

飛行服務包含3個web服務 1.galileo,Ezeego和makemy行程的WebServices(消耗15秒內得到響應)

酒店服務包含3個web服務 1.galileo,Hotelspro和Bookings.com web服務(消耗25秒獲得響應)

租車服務包含3個web服務 1.cartrwaler web服務(消耗15秒內得到響應)

,完全需要60秒才能獲得所有服務的整體響應。

我正在按順序使用JAVA編程,我打api。 任何人都可以請建議我如何使用javatechnology減少性能時間(5秒)。

我覺得多線程是可以做到的,但是在多線程中,我必須使用哪個概念,請給我指點。

+0

一個非常重要的問題......哪些框架支持您的服務調用? – AnthonyJClink

+0

儘管馬特的回答是正確的,它可能會更安全,特別是因爲您是多線程新手,以確保您支持連接池,超時,重試等一些基本知識。然後確保您無法進一步優化http連接...一旦你完全可以自由地轉向多線程,但是當你這樣做的時候需要考慮。看起來你仍然希望這個動作是原子的,所以協調是你要看的東西,特別是如果你將所有的調用作爲一個單一的結果返回給用戶。 – AnthonyJClink

+0

感謝您的回覆,請您以詳細的方式給我一個簡單的例子。 –

回答

0

使用ExecutorService提交任務以調用獨立線程中的各種Web服務,然後等待返回Future以獲得結果。

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