【问题标题】:How to prevent client REST API Call block/prioritize certain API calls with Jersey如何使用 Jersey 防止客户端 REST API 调用阻止/优先处理某些 API 调用
【发布时间】: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


    【解决方案1】:

    您可以实现一个队列系统,将每个请求按顺序排列,然后在完成时弹出它们。如果优先级较高,您可以在中间处理中将项目添加到前面。

    所以

    队列(先进先出) []:

    调用 1:[1a,1b,1c,1d]

    流行音乐:1a ... 1b ...

    调用 2:[1c,1d] Button Clicked 在第一次调用中出现碰撞

    变成

    [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循环可以做到这一点。这将允许循环继续,直到所有后续调用都完成。

    【讨论】:

    • 看起来像是反排队,但想象一下,就像现实生活中的情况一样,排队的人有世界上所有的时间等待,一个人冲进来想插队同意让他剪(因为他很着急)。队列仍然是队列,但更灵活。 P.s 让我知道进展如何!
    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2018-04-12
    相关资源
    最近更新 更多