2017-07-20 3 views
0

In meiner Grails-Anwendung, ich habe:Wie überprüft man den Inhalt des Antwortobjekts in Tomcat?

response.outputStream << resultBytes; //result bytes contains my data 

dies den Inhalt im CSV-Format lädt der Response-Header ist:

["Content-disposition": "attachment; filename=\"${fileName}\""] 

In Entwicklung sind environement Daten heruntergeladen in Ordnung, aber in anderen Umgebungen wie Produktion, Die gleiche Menge an Datendownload verursacht die Ausnahme für unterbrochene Pipes. Ich denke, das ist eine Art Tomcat-Problem (konnte den Puffer nicht löschen oder Streams in einigen Fällen schließen.) Ich bin mir nicht sicher, was genau das Problem verursacht. Bitte helfen Sie.

Die Ausnahme ist:

2017-07-13 14:51:59,751 [http-nio-8453-exec-16] ERROR StackTrace Full Stack Trace: 
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe 
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393) 
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:344) 
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:418) 
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:406) 
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:97) 
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:90) 
at org.codehaus.groovy.runtime.IOGroovyMethods.leftShift(IOGroovyMethods.java:256) 
at org.codehaus.groovy.runtime.dgm$839.invoke(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274) 
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
at com.deerwalk.exs.SearchReportDirectController.doSearchExport(SearchReportDirectController.groovy:40) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174) 
at com.deerwalk.exs.AbstractReportController.doCsvExport(AbstractReportController.groovy:36) 
at com.deerwalk.exs.AbstractReportController.doCsvExport(AbstractReportController.groovy) 
at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:222) 
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:187) 
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:88) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968) 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
+0

Mögliches Duplikat [How java.net.SocketException zu reparieren: Gebrochenes Rohr?] (https://stackoverflow.com/questions/2309561/how-to-fix-java-net-socketexception-broken-pipe) –

+0

Ich schätze den Benutzer hat den Browser geschlossen, bevor der Download abgeschlossen wurde, was zu einer fehlerhaften PipeException führt –

Antwort

0

Sie müssen IOExceptions zu handhaben, wenn die Daten direkt an den Output schieben

Dies ist der Weg zu gehen, ist: https://gist.github.com/jameskleeh/05077c4c8552d8cb1663fbac9bc674f2

def outputStream = response.outputStream 
response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "filename=\"${name}\"") 

try { 
    outputStream << <Your byte array here> 
} catch (IOException e){ 
    null 
} finally { 
    if (outputStream != null){ 
     try { 
      outputStream.close() 
     } catch (IOException e) { 
      null 
     } 
    } 
} 
Verwandte Themen