如何让JSP页面向客户端发送HTTP响应,然后继续执行?
我有一个JSP页面,必须执行一个长请求,生成一个包含大量数据的报告并将其保存到磁盘。这通常需要几分钟才能完成。这个JSP页面由我无法控制的应用程序调用。
此应用程序的超时延迟小于45秒,因此对JSP页面的每个请求都会导致超时。因此,我需要JSP页面尽可能快地将完整的HTTP响应发送到客户端(理想情况下,只要输入参数已经过验证),然后运行该过程以生成报告并在之后将其保存到磁盘。
我应该打开一个单独的线程来生成报告吗?这样,响应将被发送回客户端,而线程仍在运行。还有其他方法可以实现这个目标吗?
答案 0 :(得分:1)
JSP是视图,而不是控制器。它不是首选的工作场所。
根据定义,JSP字节是输出,因此您不能指望在jsp结束后在java指令标记中执行同步(在同一线程上)。好吧,除非你过早地关闭java指令标签中的响应......但这是不洁净的(期望用错误消息摧毁你的服务器日志......)
只有你甚至可以启动一个线程(并非所有容器都允许),这个spun thread技巧才有效。如果可以的话,你会遇到攻击的风险;您需要控制允许的线程数。这意味着在上下文中有一个池,并且如果所有线程都忙,则实现快速失败。
这可以采用ThreadPoolExecutor的形式(你可以在servlet上下文中安装),使用一个带有小限制的阻塞队列构造,你提交()你的任务但处理它可以被拒绝(并且失败)给用户一个合适的信息。)
仔细阅读ThreadPoolExecutor的排队部分。
当然,您可以在javascript端玩onTimer()来汇集进度,或者取消(当然,在会话中使用令牌作为运行任务)。