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

Java Jersey客户端-使用256Mb客户端JVM堆上载1Gb文件

隆礼骞
2023-03-14

我使用的是Jersey 2.28,想要编写一个客户端来上传1Gb的文件,而客户端JVM堆不能超过256Mb。

我在这里有什么选择?

我试着用下面的代码片段,但结果是OOM,因为Jersey似乎一直在尽可能多地从InputStream中读取数据。为了处理大量输入,可以指示球衣进行冲洗吗?

public Response upload(InputStream inputStream) {
    Client client = ClientBuilder.newBuilder().build();
    client.register(MultiPartFeature.class);
    WebTarget target = client.target("http://myexample.com").path("/upload");
    Invocation.Builder builder = target.request();

    FormDataMultiPart form = new FormDataMultiPart();
    form.bodyPart(new StreamDataBodyPart("file", inputStream, "filename.zip"));

    return builder.post(Entity.entity(form, form.getMediaType()));
}

Caused by: java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3236)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:78)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.write(CommittingOutputStream.java:200)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$UnCloseableOutputStream.write(WriterInterceptorExecutor.java:276)

共有1个答案

公西俊能
2023-03-14

解决方案是添加

client.property(ClientProperties.REQUEST_ENTITY_PROCESSING,
                RequestEntityProcessing.CHUNKED);

ClientProperties.REQUEST_ENTITY_PROCESSING:

该属性指定连接器应如何将实体序列化到输出流。;是否应使用缓冲或实体以分块编码进行流传输。

对于属性的编程定义,该值必须是< code>String的实例或枚举值< code > RequestEntityProcessing 。允许的值为:

缓冲:实体将被缓冲,内容长度将在内容长度头中发送。

块:将使用分块编码,并对实体进行流式传输。

默认值是分块的。但是,由于限制,一些连接器可以定义不同的默认值(通常在接口上无法正确支持分块编码的情况下)。此详细信息应在该特定连接器的Javadoc中指定。例如,HttpUrlConnector(默认的连接器使用缓冲作为默认模式。

配置属性常量的 String 值为“jersey.config.client.request.entity.processing”。

 类似资料:
  • 我有一个基本的烧瓶应用程序上传图像文件到服务器,然后在网页上渲染。当多个客户端上传时,在当前的设计中,它们最终覆盖相同的静态资产。当在flask中处理来自多个客户端的上传时,最好的方法是什么?

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我正在尝试通过Intellij IDEA REST客户端上传文件。我选择“文件上传(多部分/表单-数据)”并选择文件发送。这个文件的参数名是什么?在我的Sprint控制器中,我使用以下代码 我也尝试了不同的名称,比如@RequestParam的“file”、“fileTosend”、“file to send”,但是Spring总是找不到MultipartFile参数。

  • 1. 创建 Maven 工程 服务端部署完毕后,我们可以新建一个 Maven 工程使用 SOFARegistry 提供的服务。首先新建一个 Maven 工程,然后引入如下依赖: <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>registry-client-all</artifactId> <versi

  • 发起请求 让我们从导入aiohttp模块开始: import aiohttp 好啦,我们来尝试获取一个web页面。比如我们来获取下GitHub的时间轴。 async with aiohttp.ClientSession() as session: async with session.get('https://api.github.com/events') as resp:

  • 客户端事件通过 SetEvent 方法进行设置。 客户端事件有两个,它们分别定义为: type onErrorEvent interface { OnError(name string, err error) }   type onFailswitchEvent interface { OnFailswitch(Client) } 因为 go 语言不需要显式实现接口的特点,所以这两