Hello all,
I have a problem when using Tomcat 5.5.23 and apache/mod_jk 1.2.23.
I have a piece of code that will stream a file when a download request
is made by a user.
...
response.setContentType("application/octet-stream");
response.setContentLength((int)fDownload.length());
response.setHeader("Content-Disposition", "attachment; filename=\"" +
fromFileName + "\"");
// read the fromFile and write to output stream
FileInputStream fis = new FileInputStream(location + "/" +
fromFileName); //$NON-NLS-1$
BufferedOutputStream bos = new
BufferedOutputStream(response.getOutputStream());
int iLen =0;
byte[] buffer = new byte[4096];
while ((iLen = fis.read(buffer)) != -1) {
bos.write(buffer,0,iLen);
}
fis.close();
bos.close();
...
When the application is accessed directly through Tomcat on port 8080,
there is no problem.
But when we put apache / mod_jk to provide connection to tomcat, the
stream is disconnected prematurely at around 450K with the following
exceptions logged in catalina.out.
ClientAbortException: java.io.IOException
at
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.j
ava:366)
at
org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:432)
at
org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:347)
at
org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:
392)
at
org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:381)
at
org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStrea
m.java:89)
at
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at
java.io.BufferedOutputStream.write(BufferedOutputStream.java:109)
at
com.gemalto.tools.lkms.actions.ManageVersionAction.downloadFile(Unknown
Source)
at
com.gemalto.tools.lkms.actions.ManageVersionAction.execute(Unknown
Source)
at
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAc
tion.java:58)
at
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractE
xecuteAction.java:67)
at
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommand
Base.java:51)
at
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.jav
a:304)
at
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableReq
uestProcessor.java:283)
at
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:269)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:188)
at
com.gemalto.tools.lkms.util.SetCharacterEncodingFilter.doFilter(Unknown
Source)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:215)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:188)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
e.java:210)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
e.java:174)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java
:127)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java
:117)
at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:542
)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.
java:108)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:1
51)
at
org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:444)
at
org.apache.coyote.ajp.AjpAprProtocol$AjpConnectionHandler.process(AjpApr
Protocol.java:472)
at
org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.io.IOException
at
org.apache.coyote.ajp.AjpAprProcessor.flush(AjpAprProcessor.java:1197)
at
org.apache.coyote.ajp.AjpAprProcessor$SocketOutputBuffer.doWrite(AjpAprP
rocessor.java:1282)
at org.apache.coyote.Response.doWrite(Response.java:560)
at
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.j
ava:361)
... 36 more
Is there any issue on the code ?
Or is it a known mod_jk issue ? Or is it perhaps a configuration issue
on my side ?
--
Best regards,
Ketut Mahaindra (Ito)