当前位置: 首页 > 知识库问答 >
问题:

防止泽西岛客户端在发布大文件时导致内存不足错误

史意致
2023-03-14

使用 Jersey 客户端将大文件作为 InputStream 时,文件的全部内容似乎在发送到服务器之前已缓冲到内存中。这会导致大文件出现问题,因为 JVM 的堆空间不足。如何防止泽西岛客户端出现此行为?服务器端的 JAX-RS 资源方法在发送数据时似乎没有此问题。

例如:

WebResource dataUploadResource = buildDataUploadResource();
dataUploadResource.type(getMimeType()).put(getLargeInputStream());

共有1个答案

强志学
2023-03-14

为了防止这种行为,您需要将泽西客户端配置为对请求使用分块编码1。这消除了设置Content-Llong标头的需要,并且将从提供的InputStream中流式传输,而不会缓冲内存中的全部内容。

默认情况下,Jersey使用JDK的HttpURLConection类来处理HTTP请求和响应。不幸的是,这有一些与分块编码传输相关的错误。幸运的是,Jersey有扩展点,允许使用不同的HTTP客户端实现。其中一个实现基于Apache Http Client2。

apache htpp客户端处理程序有两种实现,一种支持现在结束生命的3. x版本,另一种使用较新的4. x版本。对于我们的项目,我们使用基于旧版本(3.1)的实现。该库在Maven Central的“cont在”子组下可用。

<dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-apache-client</artifactId>
    <version>1.14</version>
</dependency>

接下来,您必须初始化您的泽西客户端以使用新实现:

Client jerseyClient = ApacheHttpClient.create(getClientConfig());

为了启用分块编码,您必须在客户端配置上设置分块编码大小,因为默认情况下未启用:

private ClientConfig getClientConfig() {
   ClientConfig config = new DefaultClientConfig();

   config.getProperties().put(
            DefaultApacheHttpClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, 0);
   return config;
}

只要此属性不是null,就会使用分块编码。事实上,1.14版忽略了编码大小,因为底层apache Commons-httpClient库不支持指定大小。

 类似资料:
  • 问题内容: 我是球衣/ JAX-RS实施的新手。请在下面找到我的泽西岛客户代码以下载文件: 我的服务器端代码是: 在我的客户代码中,我收到200 OK的响应,但是我无法将文件保存在硬盘上。在下面的行中,我提到了需要保存文件的路径和位置。不知道这里出了什么问题,将不胜感激。谢谢!! 问题答案: 我不知道是否让Jersey让您简单地回应一个文件,就像这里一样: 你 可以 肯定使用StreamingOu

  • 问题内容: 我正在尝试使用Jersey客户端模拟对我的Web服务的HTTP请求。我尝试实现文档中的简单示例。这是我的短代码: 我什至没有实现整个示例,因为当前我在最后一行收到一个异常: 我只将此依赖项添加到我的: 我试图用谷歌搜索问题,以及调试应用程序,但我真的看不出问题出在哪里。 编辑 所有Maven依赖项: 问题答案: 这看起来像与JAX-RS API版本(包含MultiValuedMap)有

  • 我正在尝试编写一个Jersey客户端应用程序,它可以将多部分表单数据发布到Restful Jersey服务。我需要发布一个包含数据的CSV文件和一个包含元数据的JSON文件。我使用的是Jersey客户端1.18.3。这是我的密码(为了公司保密,有些名字已经改了)。。。 现在我在最后一行得到一个编译错误,说它不能从void转换到ClientResponse。 我之前从这篇文章中得到了一些关于Rest

  • 我的服务器端代码是: 在我的客户机代码中,我得到的响应为200OK,但我无法保存我的文件在硬盘在下面的行,我提到的路径和位置,文件需要保存。不知道这里出了什么问题,任何帮助都将不胜感激。提前谢谢!!

  • 当我的客户机应用程序尝试从我的安全RESTWeb服务请求资源时,我得到了粘贴在下面的错误。 我已经在这个主题上找到了这个答案,但是额外的代码似乎很极端。使用泽西岛客户端访问安全的宁静Web服务 有谁知道解决问题的更简单的方法吗? 我的项目:在服务器端,我正在使用jdbc realm的基本身份验证,这在浏览器中使用时工作正常。在客户端,我设置了用户名和密码,当我发送请求时发生错误。如果您需要代码片段

  • 我正在请求put操作,在执行请求后,我将重定向到GET服务URL。在这里,我面临着405 HTTP错误代码的问题。然而,在POST操作的情况下,同样的代码也适用于我。 下面的代码是endpoint: 客户: } 请告诉我如何解决这个问题。