HttpClient请求成功,并定义了超时,但挂起但没有

贾梅兹

我发现了一种奇怪的hack-y方法来修复我的代码,我想知道是否有人可以解释它为什么起作用。我正在编写与REST API通信的代码,以上传拆分为多个HTTP请求的视频文件。

我的视频部分之一请求连接时遇到问题,但从未响应。该程序将视频分为五个部分上传,但始终会挂在这五个部分的第三部分上。我决定添加一个请求硬超时,以强制程序跳过该挂起的部分。好吧,神奇的是添加了该计时器之后,就不再有挂断电话了!

有任何想法为什么会这样吗?该请求实际上并没有超时,但是此代码的添加使我的程序不断变化。

private void uploadParts(String assetId) throws IOException {
    //set up post request
    HttpClient client = HttpClientBuilder.create().build();

    String url = "";

    //prepare video
    File video = new File("files/video.mp4");
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(video));

    int partMaxSize = 1024 * 1024 * 5;
    byte[] buffer = new byte[partMaxSize];
    double fileSize = video.length();
    System.out.println(fileSize);
    System.out.println(fileSize / partMaxSize);
    int parts = (int) Math.ceil(fileSize / partMaxSize);
    System.out.println(parts);

    for(int i = 1; i < parts+1; i++)    {
        String partNumber = i + "";
        System.out.println("part: " + partNumber);
        int partSize = (int) (i < parts ? partMaxSize : fileSize);
        fileSize -= partSize;
        int tmp = 0;
        tmp = bis.read(buffer);
        url = String.format("https://www.site.com/upload/multipart/%s/%s", assetId, partNumber);

        final HttpPut request = new HttpPut(url);
        request.addHeader("Authorization", "Bearer " + accessToken);
        request.addHeader("Content-Type", "application/octet-stream");
        request.setEntity(new ByteArrayEntity(buffer));

        //Magical code start
        int hardTimeout = 5; // seconds
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                if (request != null) {
                    request.abort();
                }
            }
        };
        new Timer(true).schedule(task, hardTimeout * 1000);
        //Magical code end

        HttpResponse response = client.execute(request);
        System.out.println(response.getStatusLine().getReasonPhrase());
    }
    bis.close();
}

如果我省略了神奇的代码部分,我的代码将挂在第三部分。如果我将其包含在内,则程序运行正常。

贾梅兹

我找到了答案!原来HttpClient一次只允许一定数量的连接。根据我的代码,默认的最大连接数为2。我需要在每个连接完成并且上载运行良好之后关闭每个连接。

固定代码添加了请求连接释放。

private void uploadParts(String assetId) throws IOException {
    //set up post request
    HttpClient client = HttpClientBuilder.create().build();

    String url = "";

    //prepare video
    File video = new File("files/video.mp4");
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(video));

    int partMaxSize = 1024 * 1024 * 5;
    byte[] buffer = new byte[partMaxSize];
    double fileSize = video.length();
    System.out.println(fileSize);
    System.out.println(fileSize / partMaxSize);
    int parts = (int) Math.ceil(fileSize / partMaxSize);
    System.out.println(parts);

    for(int i = 1; i < parts+1; i++)    {
        String partNumber = i + "";
        System.out.println("part: " + partNumber);
        int partSize = (int) (i < parts ? partMaxSize : fileSize);
        fileSize -= partSize;
        int tmp = 0;
        tmp = bis.read(buffer);
        url = String.format("https://www.site.com/upload/multipart/%s/%s", assetId, partNumber);

        final HttpPut request = new HttpPut(url);
        request.addHeader("Authorization", "Bearer " + accessToken);
        request.addHeader("Content-Type", "application/octet-stream");
        request.setEntity(new ByteArrayEntity(buffer));

        //Magical code start
        int hardTimeout = 5; // seconds
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                if (request != null) {
                    request.abort();
                }
            }
        };
        new Timer(true).schedule(task, hardTimeout * 1000);
        //Magical code end

        HttpResponse response = client.execute(request);
        request.releaseConnection();
        System.out.println(response.getStatusLine().getReasonPhrase());
    }
    bis.close();
}

计时器正在工作,因为它在10秒后关闭了我的旧连接。伙计们,谢谢您的投入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

HttpClient请求成功,并定义了超时,但挂起时没有

来自分类Dev

ajax请求成功,但是php没有运行

来自分类Dev

Inmobi.com“广告请求成功,但没有投放广告”

来自分类Dev

CORS-第一个POST请求没有服务器响应,第二个请求成功

来自分类Dev

CORS-第一个POST请求没有服务器响应,第二个请求成功

来自分类Dev

Python请求挂起,而CURL没有挂起(相同请求)

来自分类Dev

尽管缺少“承载者”,但请求成功

来自分类Dev

飞镖请求成功...以某种方式?

来自分类Dev

AJAX请求成功,但返回空数据

来自分类Dev

graphiql 突变请求成功但返回 null

来自分类Dev

请求成功但有警告消息时,合适的HTTP状态代码是什么?

来自分类Dev

Xamarin HttpClient请求超时

来自分类Dev

异步aiohttp请求失败,但同步请求成功

来自分类Dev

Flask + React GET请求失败,但POST请求成功

来自分类Dev

即使请求成功,获取的响应也为空

来自分类Dev

AJAX请求成功3次,然后失败

来自分类Dev

jQuery ajax请求成功部分不起作用

来自分类Dev

请求成功返回时发出更改按钮文本的问题

来自分类Dev

d3.json 请求成功但收到错误消息

来自分类Dev

如果 Ajax 请求成功,你在 Django 中返回什么?

来自分类Dev

Angular httpClient - POST 成功,没有发送参数

来自分类Dev

插入具有单个行的数据表时,SqlBulkCopy挂起没有任何异常或超时

来自分类Dev

是什么导致XMLHttpRequest挂起而没有错误,直到浏览器默认超时?

来自分类Dev

Axios get 请求挂起,没有错误,catch 没有被触发

来自分类Dev

jQuery中的ajax请求何时认为http发布请求成功?

来自分类Dev

没有定义scrapy python请求

来自分类Dev

没有回调成功函数的嵌套 AJAX 请求

来自分类Dev

问题与HttpClient的帖子请求的URL,在Java中没有变化

来自分类Dev

没有请求返回值时,RxJS超时没有错误

Related 相关文章

  1. 1

    HttpClient请求成功,并定义了超时,但挂起时没有

  2. 2

    ajax请求成功,但是php没有运行

  3. 3

    Inmobi.com“广告请求成功,但没有投放广告”

  4. 4

    CORS-第一个POST请求没有服务器响应,第二个请求成功

  5. 5

    CORS-第一个POST请求没有服务器响应,第二个请求成功

  6. 6

    Python请求挂起,而CURL没有挂起(相同请求)

  7. 7

    尽管缺少“承载者”,但请求成功

  8. 8

    飞镖请求成功...以某种方式?

  9. 9

    AJAX请求成功,但返回空数据

  10. 10

    graphiql 突变请求成功但返回 null

  11. 11

    请求成功但有警告消息时,合适的HTTP状态代码是什么?

  12. 12

    Xamarin HttpClient请求超时

  13. 13

    异步aiohttp请求失败,但同步请求成功

  14. 14

    Flask + React GET请求失败,但POST请求成功

  15. 15

    即使请求成功,获取的响应也为空

  16. 16

    AJAX请求成功3次,然后失败

  17. 17

    jQuery ajax请求成功部分不起作用

  18. 18

    请求成功返回时发出更改按钮文本的问题

  19. 19

    d3.json 请求成功但收到错误消息

  20. 20

    如果 Ajax 请求成功,你在 Django 中返回什么?

  21. 21

    Angular httpClient - POST 成功,没有发送参数

  22. 22

    插入具有单个行的数据表时,SqlBulkCopy挂起没有任何异常或超时

  23. 23

    是什么导致XMLHttpRequest挂起而没有错误,直到浏览器默认超时?

  24. 24

    Axios get 请求挂起,没有错误,catch 没有被触发

  25. 25

    jQuery中的ajax请求何时认为http发布请求成功?

  26. 26

    没有定义scrapy python请求

  27. 27

    没有回调成功函数的嵌套 AJAX 请求

  28. 28

    问题与HttpClient的帖子请求的URL,在Java中没有变化

  29. 29

    没有请求返回值时,RxJS超时没有错误

热门标签

归档