我目前正在製作一個應用程序,它將從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:我很抱歉,如果我的代碼看起來可怕,但我仍然在學習如何使用澤西島。請讓我知道是否應該以任何方式改進代碼。謝謝。
似乎是反排隊的樣子,但想象它就像一個真實的生活情境,一些排隊等待的人在世界上一直等待,一個人衝進來想要切斷,隊列同意讓他切斷(因爲他很匆忙)。隊列仍然是一個隊列,但它更加靈活。 P.s讓我知道它是怎麼回事! – user3012749