我正在使用iframe模拟ajax文件下载,请求到tomcat app(servlet)进行文件下载,这是一个耗时的过程(可能需要1分钟以上),问题是经过一定的时间后, tomcat或浏览器客户端终止连接。请参阅下面的Tomcat例外。谁终止它,客户端或服务器?有没有办法可以增加超时?
var iframe = document.createElement("iframe"); iframe.src="http://xxxxxxxxx?";
Caused by: ClientAbortException: java.net.SocketException: Broken pipe at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:349) at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:381) at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370) at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89) at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:83) at org.apache.poi.poifs.storage.BigBlock.doWriteData(BigBlock.java:55) at org.apache.poi.poifs.storage.DocumentBlock.writeData(DocumentBlock.java:220) at org.apache.poi.poifs.storage.BigBlock.writeBlocks(BigBlock.java:86) at org.apache.poi.poifs.filesystem.POIFSDocument$BigBlockStore.writeBlocks(POIFSDocument.java:603) at org.apache.poi.poifs.filesystem.POIFSDocument.writeBlocks(POIFSDocument.java:275) at org.apache.poi.poifs.filesystem.POIFSFileSystem.writeFilesystem(POIFSFileSystem.java:390) at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1168) at net.sf.jasperreports.engine.export.JRXlsExporter.closeWorkbook(JRXlsExporter.java:199) ... 17 more Caused by: java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
答案 0 :(得分:1)
您看到的异常是由客户端超时和关闭连接引起的。
对于长时间运行的请求,一个典型的模式是初始请求命中服务器以触发一些长时间运行的工作。例如,您可以在MDB上放置一条消息来创建pdf。然后,servlet向客户端发送 202 Accepted 响应,并使用新的URL进行轮询。然后,客户端需要继续轮询此新URL,直到资源可用。这需要一些JavaScript,并且一些站点将有一个进度条,而客户端轮询以查看资源是否可用。
如果您不向客户提供反馈,他们通常会点击停止按钮并在一段时间后刷新页面。如果您对这些请求中的每一个请求进行大量操作,这可能会使事情变得更糟。