java - 如何使用 Jersey 防止客户端 REST API 调用阻止/优先处理某些 API 调用

标签 java rest servlets asynchronous client

我目前正在制作一个应用程序,该应用程序将从 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 之前执行吗?异步会起作用吗?

这是我用于 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] 然后 call1[1] => 1a

我不知道如何在 java 中执行此操作,但在 JS 中,我必须检查每个方法的响应何时完成,因为它完成了调用,以检查队列中是否有任何内容可以继续迭代它。也许 while 循环可以做到这一点。这将允许循环继续,直到所有后续调用完成。

关于java - 如何使用 Jersey 防止客户端 REST API 调用阻止/优先处理某些 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32192067/

相关文章:

java - 链接到 webservice 外部的属性文件

java - 在 servlet 中进行清理的正确方法

java - 任何工具来检查 servlet 过滤器是否工作

java - 如何使用 Log4j2 在关闭 Hook 中登录?

java - Spring 绑定(bind)形式多选

java - WebSphere Liberty 在 WAR 的类目录中找不到 log4j.properties

angular - 在 Angular HttpClient 中捕获错误

rest - 如何保护来自 Postman 等第三方工具的 Web API 请求调用?

javascript - TOMCAT报告此错误: INFO: Character decoding failed

java - 检查 GPS 和蓝牙是否已激活时出现问题