it-swarm.com.de

Probleme mit ausgelaufenen Downloads über TomCat?

Wir haben unserer Meinung nach viele fehlgeschlagene Download-Versuche und möchten verstehen, warum.

Wir bieten Downloads über einen E-Mail-Link an (typisch):

 http://www.semanticdesigns.com/deliverEval/<productname>

Dies wird von Tomcat unter Linux über eine JSP-Datei mit folgendem Code verarbeitet:

response.addHeader( "Content-Disposition", "attachment; filename=" + fileTail );
response.addHeader( "Content-Type", "application/x-msdos-program" );
byte[] buf = new byte[8192];
int read;

try {
    Java.io.FileInputStream input = new Java.io.FileInputStream( filename );
    Java.io.OutputStream o = response.getOutputStream();
    while( ( read = input.read( buf, 0, 8192 ) ) != -1 ){
        o.write( buf, 0, read );
    }
    o.flush();
} catch( Exception e ){
    util.fatalError( request.getRequestURI(), "Error sending file '" + filename + "' to client", e );
    throw e;
}

Wir erhalten viele gemeldete Fehler (ca. 50% Fehlerrate):

 URI
 ---
 /deliverEval/download.jsp

 Code Message: Error sending file '/home/sd/ShippingMasters/DMS/Domains/C/GCC3/Tools/TestCoverage/SD_C~GCC3_TestCoverage.1.6.12.exe' to client

 Stack Trace
 -----------
 null

 at org.Apache.coyote.Tomcat5.OutputBuffer.realWriteBytes(byte[], int, int) (Unknown Source)
 at org.Apache.Tomcat.util.buf.ByteChunk.append(byte[], int, int) (Unknown Source)
 at org.Apache.coyote.Tomcat5.OutputBuffer.writeBytes(byte[], int, int) (Unknown Source)
 at org.Apache.coyote.Tomcat5.OutputBuffer.write(byte[], int, int) (Unknown Source)
 at org.Apache.coyote.Tomcat5.CoyoteOutputStream.write(byte[], int, int) (Unknown Source)
 at org.Apache.jsp.deliverEval.download_jsp._jspService(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) (Unknown Source)
 at org.Apache.jasper.runtime.HttpJspBase.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) (Unknown Source)
 at javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) (Unknown Source)
 at org.Apache.jasper.servlet.JspServletWrapper.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, boolean) (Unknown Source)
 at org.Apache.jasper.servlet.JspServlet.serviceJspFile(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, Java.lang.String, Java.lang.Throwable, boolean) (Unknown Source)
 at org.Apache.jasper.servlet.JspServlet.service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) (Unknown Source)
 at javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) (Unknown Source)
 at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) (Unknown Source)
 at org.Apache.catalina.core.ApplicationFilterChain.doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse) (Unknown Source)
 at org.Apache.catalina.core.StandardWrapperValve.invoke(org.Apache.catalina.Request, org.Apache.catalina.Response, org.Apache.catalina.ValveContext) (Unknown Source)

Wir verstehen nicht, warum diese Rate so hoch sein sollte. Gibt es eine Möglichkeit, weitere Informationen zur Fehlerursache zu erhalten?

Es ist nützlich zu wissen, dass dies ziemlich große Dokumente sind, 3-50 Megabyte. Sie befinden sich auf dem Linux-Server, daher handelt es sich beim Lesen lediglich um einen lokalen Datenträgerlesevorgang, und es ist unwahrscheinlich, dass er zu dem Problem beiträgt. Aber die reine Größe könnte ein Problem für den Browser des Empfängers sein?

Ist diese Fehlerrate typisch für Downloads? Aus meiner persönlichen Erfahrung mit dem Herunterladen von Dokumenten anderer Personen geht hervor, dass dies nicht der Fall ist. Unsere internen Versuche haben gezeigt, dass dies sehr zuverlässig ist, aber wir arbeiten in unserem internen Netzwerk für solche Experimente, sodass wir die Komplexität des dazwischenliegenden Internets vermissen.

2
Ira Baxter

Gibt es eine Möglichkeit, weitere Informationen zur Fehlerursache zu erhalten?

Fügen Sie Ihrer Protokollierung Folgendes hinzu: (Ich bin kein Java Guru, aber ich glaube, dass die meisten Variablen, die Sie benötigen, in der Dokumentation org.Apache.catalina.connector.Request beschrieben sind )

Vollständiger Ausnahmedump - e.toString() - Das bereitgestellte Codebeispiel unterscheidet nicht zwischen einem Client-Abbruch und einem fehlgeschlagenen Öffnen einer Datei, es sei denn, es wird protokolliert Wenn die Ausnahme an einer anderen Stelle ausgelöst wird, sind weitere Informationen erforderlich, um festzustellen, wo Fehler auftreten

Client-IP, Benutzeragent und HTTP-Verweis - teilen sich viele der Anforderungen einen gemeinsamen Thread? (z. B. Bot, Quellnetzwerk, geografischer Standort oder Entfernung, Browser, verknüpft von einer anderen Site, auf der die Download-Dateigröße nicht angezeigt wird usw.)

1
danlefree