【发布时间】:2015-11-18 10:52:30
【问题描述】:
我目前正在制作一个应用程序,该应用程序将从 api 获取信息并对其进行分析并将其存储在后端的 mongodb 中。我使用 java servlet 作为服务器,使用 jersey 作为调用 api 的客户端。我遇到了一个问题,如果有人告诉我的 servlet 告诉 jersey 客户端快速连续多次调用 api,则网站会简单地冻结,因为只需要大约 20 秒才能获取所有内容。现在一次自发地有 5 个查询,完成所有事情大约需要 100 秒。
注意:我没有使用从 api 获得的所有数据并立即将其提供给用户。我只提供来自 1 个调用的用户数据,而其他 300 个调用是将他们的所有数据放入我的数据库中。
tl;博士: 用户点击按钮 -> jersey 进行 400 次 api 调用 -> jersey 从 1 个调用中向用户提供数据,然后在后面处理其他 399(需要 20 秒) -> 在 20 秒内,其他人点击按钮 -> 他不会得到1 次通话的数据,直到前一个人的 399 次通话完成为止。
我能否以某种方式使 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:如果我的代码看起来很糟糕,我很抱歉,但我仍在学习如何使用 Jersey。请让我知道是否应该以任何方式改进代码。谢谢。
【问题讨论】:
标签: java rest servlets asynchronous client