2012-09-18 10 views
16

Otras preguntas sobre Desbordamiento de pila han abordado esta cuestión, pero ninguna de las respuestas proporcionadas me ha ayudado a abordar el problema.Falló el procesamiento de la solicitud multipart/form-data. Tiempo de espera de lectura superado

Estoy tratando de cargar un archivo de cualquier lugar entre 10 kB a 16 MB desde un applet usando Apache HTTP Commons. Todo funciona bien en mi entorno local.

que estoy recibiendo la siguiente excepción sólo en mi servidor de producción (Tomcat 6.0, https://www.dailyrazor.com/), independientemente del tamaño de archivo:

org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. Read timed out 
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:384) 
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:116) 
    at com.actura.helper.UploadHelper.processUpload(UploadHelper.java:92) 
    at com.actura.voice.upload.FileUploadServlet.process(FileUploadServlet.java:85) 
    at com.actura.voice.upload.FileUploadServlet.doPost(FileUploadServlet.java:75) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769) 
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698) 
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
    at java.lang.Thread.run(Thread.java:662) 

Este es el registro de depuración de los Comunes IO:

2012-Sep-18 11:26:28,446 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory constructor (listener) 
2012-Sep-18 11:26:28,794 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:26:28,800 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:26:28,800 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:26:28,802 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:26:28,803 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:26:28,804 [TP-Processor5] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
processing folder... /home/dixieh83/public_html/ActuraVoiceRecorderDemo/temp 
2012-Sep-18 11:27:47,062 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory constructor (listener) 
2012-Sep-18 11:27:47,461 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:27:47,461 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:27:47,462 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItemFactory 
    DEBUG inside MonitoredDiskFileItemFactory createItem 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside MonitoredDiskFileItem constructor 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG inside getOutputStream() 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG inside MonitoredOutputStream constructor 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredOutputStream 
    DEBUG leaving MonitoredOutputStream contructor 
2012-Sep-18 11:27:47,463 [TP-Processor4] com.actura.voice.upload.MonitoredDiskFileItem 
    DEBUG leaving getOutputStream() 

Aparte de este problema de carga, mi applet funciona bien.

Ésta es la configuración del servidor como se describe en server.xml archivo de mi servidor de producción:

<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector address="127.0.0.1" port="9609" enableLookups="false" protocol="AJP/1.3" connectionTimeout="30000" maxThreads="50" minSpareThreads="1" maxSpareThreads="3" disableUploadTimeout="true" /> 

mí La velocidad de mi conexión a Internet está muy bien (2,01 Mbps de bajada y 0,42 Mbps hacia arriba), por lo que deja a esta excepción perplejo. Ya configuré connectionTimeOut en 3000000, pero todavía tengo la excepción. ¿Debo configurar connectionTimeOut en -1 para que sea ilimitado?

Los permisos de archivos se establecen en 777 en el directorio desde el que estoy cargando y estoy usando JDK versión 7 para ejecutar el applet en el navegador.

Java salida de la consola:

Java Plug-in 10.7.2.10 
Using JRE version 1.7.0_07-b10 Java HotSpot(TM) Client VM 

Cuando falla la carga, me sale esto en la consola:

java.net.SocketException: Connection reset by peer: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 
    at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:169) 
    at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:119) 
    at org.apache.http.entity.mime.content.InputStreamBody.writeTo(InputStreamBody.java:70) 
    at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:206) 
    at org.apache.http.entity.mime.HttpMultipart.writeTo(HttpMultipart.java:224) 
    at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:183) 
    at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:98) 
    at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108) 
    at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:122) 
    at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:271) 
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.sendRequestEntity(ManagedClientConnectionImpl.java:197) 
    at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:257) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1066) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1044) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:1035) 
    at com.actura.app.util.ApplicationUtil.uploadUsingApache(ApplicationUtil.java:143) 
    at com.actura.app.util.ApplicationUtil.saveWaveToServer(ApplicationUtil.java:90) 
    at com.actura.app.capture.RecorderUI.saveButtonActionPerformed(RecorderUI.java:1856) 
    at com.actura.app.capture.RecorderUI.access$17(RecorderUI.java:1824) 
    at com.actura.app.capture.RecorderUI$7.actionPerformed(RecorderUI.java:1325) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

he llegado a saber que esto podría ser un problema de mi ISP. Me pregunto si es el problema de iSP el por qué puedo usar softwares como temviewer y Skype sin problemas.

El siguiente es el código que realiza la carga:

public static String uploadUsingApache(URL url, List<File> list, 
      String userId, String accountId, String waveDuration) 
      throws Exception { 

     // The execution: 
     DefaultHttpClient httpclient = new DefaultHttpClient(); 

     HttpPost method = new HttpPost(url.toString()); 

     MultipartEntity entity = new MultipartEntity(); 
     entity.addPart("userId", new StringBody(userId, Charset 
       .forName("UTF-8"))); 
     entity.addPart(IVR_ACCOUNT_KEY, new StringBody(accountId, Charset 
       .forName("UTF-8"))); 
     entity.addPart(IVR_MP3LEN_KEY, new StringBody(waveDuration, Charset 
       .forName("UTF-8"))); 

     // FileBody fileBody = new FileBody(list.get(0)); 
     // entity.addPart("file", fileBody); 

     for (File f : list) { 

      byte[] imageBytes = fileToByteArray(f); 
      entity.addPart("attachment_field", new InputStreamKnownSizeBody(
        new ByteArrayInputStream(imageBytes), imageBytes.length, 
        "audio/wav", f.getName())); 
      method.setEntity(entity); 
     } 

     ResponseHandler<String> responseHandler = new BasicResponseHandler(); 

     // HttpResponse response = httpclient.execute(method,responseHandler); 
     String responseText = httpclient.execute(method, responseHandler); 

     // error text 
     if (responseText.contains("<exception>")) { 
      responseText = responseText.replace("<exception>", ""); 
      responseText = responseText.replace("</exception>", ""); 
      throw new Exception(responseText); 
     } 

     // System.out.println(" Status " +response.getStatusLine()); 
     List<String> deleteList = Arrays.asList(responseText.split(",")); 

     StringBuffer sb = new StringBuffer(); 
     int cnt = 1; 
     for (File f : list) { 
      if (deleteList.contains(f.getName())) { 
       sb.append(f.getName() + (cnt == deleteList.size() ? "" : ", ")); 
       f.delete(); 
       cnt++; 
      } 

     } 

     if (deleteList.size() > 1) { 
      sb.append(" are "); 
     } else if (deleteList.size() == 1) { 
      sb.append(" is "); 
     } else { 

     } 

     sb.append(" successfully saved."); 

     return sb.toString(); 
    } 

Al pulsar el botón de carga en la GUI de mi applet, que llama el método anterior y al mismo tiempo la GUI se congela. 10 a 50 segundos más tarde, el servidor arroja el FileUploadException. El servlet notifica al applet sobre la excepción, pero el applet se bloquea durante cuatro o cinco minutos antes de notificar al usuario de la excepción.

¿Por qué hay tanto retraso si hay algo mal en el lado del servidor?

+1

Sería de gran ayuda si usted se conectó a la pregunta similar (s) que usted' ya se ha visto publicado, y en particular si detalla los pasos que ya ha probado, por qué no funcionan para usted y cómo difiere su entorno de aquellos en los que esa solución funcionó. –

+0

¿En qué versión de Java está ejecutando el applet en el navegador? ¿El applet se carga y funciona bien aparte de esta funcionalidad de carga? –

+0

sí, estoy usando Jdk 7 para el applet en ejecución. el applet funciona bien aparte de esta funcionalidad de carga. ¿Hay algún problema con la velocidad de carga? – Mihir

Respuesta

27

Esto me ayudó mucho: http://blog.somepixels.net/en/502-proxy-error-uploading-from-apache-mod_proxy-to-tomcat-7/

Básicamente en mi server.xml que configurarlo como:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" 
     connectionUploadTimeout="36000000" disableUploadTimeout="false" 
     connectionTimeout="60000" redirectPort="8443" /> 
+0

[connectionUploadTimeout]: especifica el tiempo de espera, en milisegundos, que se utilizará mientras se realiza una carga de datos. Esto solo tiene efecto si disableUploadTimeout se establece en falso. [disableUploadTimeout]: este indicador permite que el contenedor de servlets use un tiempo de espera de conexión diferente, generalmente mayor, durante la carga de datos. Si no se especifica, este atributo se establece en true, lo que desactiva este tiempo de espera más largo. [fuente]: https://tomcat.apache.org/tomcat-7.0-doc/config/http.html –

4

No está claro a partir de la pregunta con qué configuración se está ejecutando (o lo que ya ha intentado), pero el problema es casi por definición que el tiempo de espera del socket se excede durante la carga.

Se produce un error porque el archivo no se recibió por completo antes de que se alcanzara el tiempo de espera correspondiente. Esto es coherente con las cosas que funcionan en la prueba (en una red local), pero no cuando se ejecuta en Internet mucho más lento (especialmente cuando se trata de velocidades de carga).

Eche un vistazo a su server.xml para la definición relevante <Connector>. Le interesará el valor de los atributos connectionTimeout o connectionUploadTimeout (este último si disableUploadTimeout está establecido en verdadero).

En la ausencia de evidencia de problemas más infames, espero que pueda resolver este problema simplemente aumentando el tiempo de espera de conexión.

+0

este es el xml que copié de server.xml de mi servidor de producción. Mihir

+0

también mi velocidad de internet está muy bien, no entiendo cuál es el problema cuando se trata de servidor de producción, ¿debo hacer que connectionTimeOut -1 para hacerlo ilimitado? – Mihir

+0

acabo de verificar mi velocidad con speedtest.com y el resultado es que la velocidad de descarga es de 2.01 mbps y la velocidad de carga es de 0.42 mbps. Configuré connectionTimeout en 3000000 pero con la misma excepción. Cómo puedo deshacerme de esto ? – Mihir

Cuestiones relacionadas