Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止客户端REST API调用阻塞/使用Jersey对某些API调用进行优先级排序_Java_Rest_Servlets_Asynchronous_Client - Fatal编程技术网

Java 如何防止客户端REST API调用阻塞/使用Jersey对某些API调用进行优先级排序

Java 如何防止客户端REST API调用阻塞/使用Jersey对某些API调用进行优先级排序,java,rest,servlets,asynchronous,client,Java,Rest,Servlets,Asynchronous,Client,我目前正在开发一个应用程序,它将从api获取信息,并对其进行分析,然后将其存储在后端的mongodb中。我使用JavaServlet作为服务器,jersey作为调用api的客户端。我遇到了一个问题,如果有人告诉我的servlet让jersey客户端快速连续多次调用api,网站就会冻结,因为只需一次查询就可以获得所有内容,需要大约20秒。现在一次自发地有5个查询,完成所有查询需要大约100秒 注意:我没有使用从api获得的所有数据并立即将其提供给用户。我只提供了一个调用中的用户数据,而其他300个

我目前正在开发一个应用程序,它将从api获取信息,并对其进行分析,然后将其存储在后端的mongodb中。我使用JavaServlet作为服务器,jersey作为调用api的客户端。我遇到了一个问题,如果有人告诉我的servlet让jersey客户端快速连续多次调用api,网站就会冻结,因为只需一次查询就可以获得所有内容,需要大约20秒。现在一次自发地有5个查询,完成所有查询需要大约100秒

注意:我没有使用从api获得的所有数据并立即将其提供给用户。我只提供了一个调用中的用户数据,而其他300个调用将把他们的所有数据放入我的数据库中

tl;博士: 用户单击按钮->jersey进行400个api调用->jersey从一个调用中向用户提供数据,然后在后面处理其他399(需要20秒)->在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]1a


我不知道如何在java中做到这一点,但在JS中,我必须在每个方法完成调用时检查每个方法的响应何时完成,以检查队列中是否有任何东西可以继续对其进行迭代。也许一段时间的循环可以做到这一点。这将允许循环继续,直到所有后续调用完成

这看起来像是反排队,但想象一下,这就像现实生活中的情形,排队的人有世界上所有的时间等待,一个人冲进来想插队,队列同意让他插队(因为他很匆忙)。队列仍然是一个队列,但它更灵活。让我知道进展如何!