Skip to Main Content

New to Java

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

ExcelPOI - How to avoid Socket Closed exception if user takes time 2 dwnld?

843789Mar 17 2010 — edited Mar 19 2010
I 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
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 16 2010
Added on Mar 17 2010
4 comments
2,284 views