I'm using Jersey 2.28 and want to write a client to upload 1Gb files, while the client JVM heap cannot go above 256Mb.
What are my options here?
I've tried with the snippet below but getting OOM as it seems Jersey keeps reading as much as it can from the InputStream. Can Jersey be instructed to flush in order to deal with large inputs?
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)