我有一个jsp页面,用于生成多部分数据(xls)。 我没有在这个jsp页面上获得任何数据,但是当我尝试在日志中打印数据时,我可以看到所有记录都被提取。
如何处理请求。
Request ---(goes to)---> Webservlet ---(delegate to handler)---> Java Class(ReportHandler.java)
现在我们调用ReportHandler.runReport()
的方法,负责从数据库中获取数据。此方法需要很长时间(差不多12分钟)才能获取记录。
在我们获得结果集中的数据后,我们将其传递给jsp页面并使用结果集生成报告。
1> while(rs.next()) {system.out.println("<tr><td>"+partnerId+"</td></tr>")}
我可以看到partnerId - 它正在控制台上打印出来。 但是jsp并没有在浏览器上呈现数据。 12-14分钟后,浏览器显示错误消息(没有状态代码),请求超时并重置连接。
现在我的问题是,如果连接在服务器上超时,那么数据将无法在控制台上打印,如果连接在客户端超时,那么如何修复它,我试图在客户端修复时间最后将network.http.connection.timeout
属性设置为long但没有效果。
2> I am using out.print(<table><tr><td>"+rs.getInt(partnerId)+"</td></tr></table>")
生成报告但是虽然data(out.flush())
被强制刷新,但它没有在jsp上生成任何数据。
我确信我们在jsp页面上获取数据但是它没有呈现,因为上面的System.out.println()
是在while循环中打印记录。
请帮助,因为我一直在寻找解决方案,但无法解决问题。
答案 0 :(得分:0)
如果您无法将后端时间缩小到合理的范围(少于5-10秒,这取决于受众的类型),您最好更改模式。如果有意义,您可以在指定时间安排创建文档(例如使用Quartz)。否则你需要某种服务器通知。由于长轮询是浪费资源而且专用的彗星服务器仅对此事没有意义,我建议使用旧的Javascript轮询。基本上你有一个脚本,每隔X
秒检查文件是否准备就绪。您将通过实现两个不同的脚本来修改服务器端脚本以遵循此模式。一个人完成实际工作,另一个人管理后台进程及其状态表,并由另一个脚本通知。这是伪代码
//~client
every 30 seconds check /document?id=12345 {
if (ready) {
display URL for download
break
} else {
display loading.gif
}
}
//~server (worker) not reachable by public URL, it's a background thread
notify: processing document with id #1234
.... do processing ....
notify: finished document with id #1234
//~server (notifier) has a URL like /document?id=1234
if (#1234 isReady)
output #1234.URL
else
output "processing..."