web-dev-qa-db-fra.com

Pipe cassée lors de l'écriture d'octets dans ServletOutputStream

Lors de l'exécution de ce code,

ServletOutputStream out = response.getOutputStream();
out.write(bytes, 0, bytes.length);
out.flush();  
out.close();  

Je reçois fréquemment cette exception et je ne comprends pas pourquoi cela se produit.

Caused by: ClientAbortException:  Java.net.SocketException: Broken pipe
    at org.Apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.Java:358)
    at org.Apache.Tomcat.util.buf.ByteChunk.append(ByteChunk.Java:354)
    at org.Apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.Java:381)
    at org.Apache.catalina.connector.OutputBuffer.write(OutputBuffer.Java:370)
    at org.Apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.Java:89)

J'ai une application web fonctionnant sur un serveur linux, sous JBoss 4.2.3 et MySQL.

Comment cela est-il causé et comment puis-je le résoudre?

13
gdfbarbosa

Cela est généralement dû à la déconnexion du client. Il y a plusieurs raisons pour lesquelles le client peut s'être déconnecté (expiration du délai, le navigateur a été fermé, etc.). De plus, en règle générale, si vous n'avez pas ouvert le flux, ne le fermez pas. Plus d'informations sur la fermeture du flux ici Dois-je fermer le flux de sortie du servlet? .

9
km1

Cela peut être amélioré en ajoutant response.setBufferSize (bufferSizeneeded + 200); La taille de tampon par défaut est 8124, ce qui peut ne pas s'appliquer à tous les utilisateurs! et response.setHeader ("Content-Length", String.valueOf (exportData.length));

2