我目前正在开发一个应用程序,该应用程序将从api中获取信息并进行分析并将其存储在后端的mongodb中。我使用java servlet作为服务器,使用jersey作为客户端调用api。我遇到一个问题,如果有人告诉我的servlet告诉泽西客户端快速连续多次调用api,则该网站将被冻结,因为仅一次查询就将花费约20秒的时间。现在,一次自发地执行5个查询,完成所有操作大约需要100秒。
注意:我没有使用从api中获取的所有数据,而是立即将其提供给用户。我只给1个呼叫提供用户数据,而其他300个呼叫则将他们的所有数据放入我的数据库。
tl; dr:用户单击按钮->球衣进行400个api调用->球衣从1个调用中向用户提供数据,然后在20秒内回处理其他399个(耗时20秒)->,其他人则单击按钮->直到前一个用户的399个呼叫完成后,他才会从该1个呼叫中获取数据。
我能否以某种方式使399调用在后台运行,以便第二个用户的第一个api调用(可以让他们看些东西)可以继续执行并在399之前执行?异步会工作吗?
这是我对jersey 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。请让我知道是否应该以任何方式改进代码。谢谢。
您可以实现一个队列系统,该队列系统将每个请求按顺序排列,然后在完成时将其弹出。如果优先级较高,则可以在中间处理时将项目添加到最前面。
所以
排队(先进先出)[]:
通话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]然后调用1 [1] => 1a
我不知道如何在Java中执行此操作,但是在JS中,我必须检查每个方法的响应何时完成,因为它完成了调用,以检查队列中是否有任何内容可以对其进行迭代。也许while循环可以做到这一点。这将允许循环继续进行,直到所有后续调用完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句