Comment éviter OutOfMemoryError lors du téléchargement d'un fichier volumineux à l'aide du client Jersey
Je suis à l'aide de Jersey client http en fonction de la demande. Il fonctionne bien que si le fichier est petit, mais de l'exécuter dans l'erreur, quand je poste un fichier avec la taille de 700M:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:61)
at com.sun.jersey.api.client.CommittingOutputStream.write(CommittingOutputStream.java:90)
at com.sun.jersey.core.util.ReaderWriter.writeTo(ReaderWriter.java:115)
at com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider.writeTo(AbstractMessageReaderWriterProvider.java:76)
at com.sun.jersey.core.impl.provider.entity.FileProvider.writeTo(FileProvider.java:103)
at com.sun.jersey.core.impl.provider.entity.FileProvider.writeTo(FileProvider.java:64)
at com.sun.jersey.multipart.impl.MultiPartWriter.writeTo(MultiPartWriter.java:224)
at com.sun.jersey.multipart.impl.MultiPartWriter.writeTo(MultiPartWriter.java:71)
at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:300)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:568)
at TestHttpRequest.main(TestHttpRequest.java:42)
voici mon code:
ClientConfig cc = new DefaultClientConfig();
Client client = Client.create(cc);
WebResource resource = client.resource("http://localhost:8080/JerseyWithServletTest/helloworld");
FormDataMultiPart form = new FormDataMultiPart();
File file = new File("E:/CN_WXPPSP3_v312.ISO");
form.field("username", "ljy");
form.field("password", "password");
form.field("filename", file.getName());
form.bodyPart(new FileDataBodyPart("file", file, MediaType.MULTIPART_FORM_DATA_TYPE));
ClientResponse response = resource.type(MediaType.MULTIPART_FORM_DATA).post(ClientResponse.class, form);
source d'informationauteur Mr rain
Vous devez vous connecter pour publier un commentaire.
Vous pourriez utiliser les flux.Essayez quelque chose comme ça sur le client:
avec des ressources de ce genre sur le serveur:
Pour que votre code ne pas dépendre de la taille du fichier à télécharger, vous devez:
client.setChunkedEncodingSize(1024);
Serveur:
Client:
Ci-dessous est le code de téléchargement d'une (potentiellement de gros) fichier avec l'encodage de transfert en bloc (c'est à dire des flux) à l'aide de Jersey 2.11.
Maven:
Java:
Dans mon cas (Jersey 2.23.2) rschmidt13 de la solution a donné cet avertissement:
Cela peut être résolu en ajoutant la ligne suivante:
Cependant, je pense que une solution de nettoyage peut être obtenu à l'aide de la
StreamingOutput
interface.Je poste un exemple complet en espérant que cela pourrait être utile.
Client (téléchargement de Fichier)
Serveur
Si possible, pouvez-vous diviser le fichier que vous envoyez en parties plus petites? Cela permettra de réduire l'utilisation de la mémoire, mais vous avez besoin de changer le code sur les deux côtés du téléchargement de code.
Si vous ne pouvez pas, alors votre espace de tas est trop faible, essayez d'augmenter avec ce paramètre de JVM. Dans votre serveur d'applications ajouter/modifier les
Xmx
options JVM. Par exempleà définir Max de la mémoire système de 1 go