2015-08-24 61 views
1

我目前正在製作一個應用程序,它將從api獲取信息並分析它並將其存儲在我的後端的mongodb中。我使用java servlet作爲服務器和球衣作爲調用API的客戶端。我遇到了一個問題,如果有人告訴我的servlet告訴球衣客戶端連續多次調用api,那麼網站會簡單地凍結,因爲只需要一秒鐘的時間就可以獲得所有內容。既然現在有5個查詢,那麼完成所有操作需要大約100秒的時間。如何防止客戶端REST API使用Jersey調用塊/優先調用某些API調用

注意:我沒有使用從api獲得的所有數據並立即將其提供給用戶。我只從1個呼叫中提供用戶數據,而另外300個呼叫是將所有數據放入我的數據庫中。用戶點擊按鈕 - >球衣製作400個API調用 - >球衣從1個調用向用戶提供數據,然後在其他工作中處理另一個399(需要20秒) - >在20秒內,某人否則點擊按鈕 - >直到前一個人的399個呼叫完成後,他纔會從該1個呼叫中獲取數據。

我可以做些什麼讓399調用在後臺,這樣第二個用戶的第一個api調用(它給了他們什麼東西看看)可以繼續並在399之前執行?異步工作?

這裏是我的代碼通過的球衣API調用的方式: 構造:

public APICaller(){ 
    client = Client.create(); 
    sync = RateLimiter.getInstance(); 
} 

函數調用:

public String call(String url){ 
    try { 
     WebResource webResource = client 
      .resource(url); 

     ClientResponse response = webResource.accept("application/json") 
        .get(ClientResponse.class); 

     if (response.getStatus() != 200) { 
      /*throw new RuntimeException("Failed : HTTP error code : " 
      + response.getStatus() + " header : " + response.getHeaders());*/ 
      System.out.println("Failed : HTTP error code : " 
      + response.getStatus() + " header : " + response.getHeaders()); 
      if(response.getStatus() == 404) 
       return "404"; 
      if(response.getStatus() == 429) 
       return "429"; 
      if(response.getStatus() == 503) 
       return "503"; 
     } 

     String output = response.getEntity(String.class); 

     return output; 

     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    return null; 
} 

PS:我很抱歉,如果我的代碼看起來可怕,但我仍然在學習如何使用澤西島。請讓我知道是否應該以任何方式改進代碼。謝謝。

回答

2

您可以實現一個隊列系統,將每個請求按順序排列,然後在完成時彈出它們。如果優先級較高,則可以在中間處理中將項目添加到前端。

所以

隊列(先入先出) []:

呼叫1:[1A,1B,1C,1D]

流行:1A ... 1b中。 ..

呼叫2:[1C,1D] < --- 按鈕已點擊凸點在第一呼叫

變得

[2A,1C,1D,2B,2C,2D]

流行:圖2a ... 1C ... 1D ...... 2D

可以通過將它們放在一個數組本身中來獲得第一個調用,所以call1 [1a,1b,1c,1d]和call2 [2a,2b,2c,3d]然後call1 [1] => 1a

我不知道如何在java中做到這一點,但在JS中,我必須檢查每個方法的響應何時完成,因爲它完成調用以檢查隊列中是否有任何內容不斷迭代它。也許一個while循環可以做到這一點。這將允許循環繼續,直到所有後續的呼叫完成。

+1

似乎是反排隊的樣子,但想象它就像一個真實的生活情境,一些排隊等待的人在世界上一直等待,一個人衝進來想要切斷,隊列同意讓他切斷(因爲他很匆忙)。隊列仍然是一個隊列,但它更加靈活。 P.s讓我知道它是怎麼回事! – user3012749