ExcelPOI - How to avoid Socket Closed exception if user takes time 2 dwnld?
843789Mar 17 2010 — edited Mar 19 2010I am using Excel POI to generate excel reports and provide for download using ServletOutputStream. Everything works fine, except that when the browser prompts to Open/Save the report, if the user doesnt click either of the options soon enough (roughly within 30 seconds), then a "java.net.SocketException: Socket closed" is visible in the backend console.
But the front-end, the Open/Save dialog box will still be available for the user. Now if the user clicks on Open or Save, he gets a dialog box with an error message: "<filename> cannot be accessed. The file may be corrupted, located on a server that is not responding or read-only."
The code snippet is:
response.setHeader("Content-disposition", "attachment; filename=" + strSelReportName + "_" + strToday + ".xls");
response.setContentType("application/vnd.ms-excel");
response.setHeader( "Content-Description", "Download Excel Report" );
try
{
HSSFWorkbook wb = mq.writeData(rs, repColumnHeading.replaceAll("_", " "));
logger.debug("doPost:: wb: " + wb);
ServletOutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
catch (SocketException se)
{
se.printStackTrace();
logger.error("doPost:: SocketException:: Report Download cancelled by User: " + se.getMessage());
System.out.println("doPost:: SocketException:: Report Download cancelled by User: " + se.getMessage());
}
catch (Exception e)
{
e.printStackTrace();
logger.error("doPost:: Exception occurred: " + e.getMessage());
}
finally
{
try
{
if (rs != null) rs.close();
if (mq != null) mq.close();
}
catch (Exception e)
{
e.printStackTrace();
logger.error("doPost:: Exception while closing Resources: " + e.getMessage());
}
}
The stacktrace is as follows:
java.net.SocketException: Socket closed
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at weblogic.servlet.internal.ChunkOutput.writeChunkTransfer(ChunkOutput.java:525)
at weblogic.servlet.internal.ChunkOutput.writeChunks(ChunkOutput.java:504)
at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:382)
at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java:469)
at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:304)
at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:133)
at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:169)
at java.io.OutputStream.write(OutputStream.java:58)
at org.apache.poi.poifs.storage.BigBlock.doWriteData(BigBlock.java:54)
at org.apache.poi.poifs.storage.DocumentBlock.writeData(DocumentBlock.java:219)
at org.apache.poi.poifs.storage.BigBlock.writeBlocks(BigBlock.java:85)
at org.apache.poi.poifs.filesystem.POIFSDocument$BigBlockStore.writeBlocks(POIFSDocument.java:602)
at org.apache.poi.poifs.filesystem.POIFSDocument.writeBlocks(POIFSDocument.java:274)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.writeFilesystem(POIFSFileSystem.java:262)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:742)
at norkomreports.util.DownloadServlet.doPost(DownloadServlet.java:278)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3244)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2010)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1916)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
Please let me know if this situation can be overcome in anyway. Also let me know if you need any further information.
Regards,
Raghu