发送 HTTP 响应后继续 JSP 执行

Continue JSP execution after sending HTTP response

如何让 JSP 页面向客户端发送 HTTP 响应,然后继续执行?

我有一个 JSP 页面,它必须执行一个长请求,该请求会生成包含大量数据的报告并将其保存到磁盘。这通常需要几分钟才能完成。此 JSP 页面由我无法控制的应用程序调用。

此应用程序的超时延迟小于 45 秒,因此对 JSP 页面的每个请求都会导致超时。因此,我需要 JSP 页面尽快将完整的 HTTP 响应发送给客户端(理想情况下,一旦输入参数被验证),然后 运行 过程生成报告并随后将其保存到磁盘。

我应该打开一个单独的线程来生成报告吗?这样,响应将发送回客户端,而线程仍处于 运行ning 状态。还有其他方法可以实现吗?

A​​ JSP 是视图,不是控制器。这不是执行工作的首选地点。

根据定义,JSP 字节是输出,因此您不能期望在 jsp 结束后的 java 指令标记中进行同步(在同一线程上)工作.好吧,除非你过早地关闭了 java 指令标签中的响应......但那是不干净的(期望用错误消息破坏你的服务器日志......)

旋转线程技巧仅在您甚至可以启动线程时才有效(并非所有容器都允许这样做)。如果可以,您 运行 会面临被攻击的风险;您需要控制允许的线程数。这意味着在上下文中有一个池,并在所有线程都忙时实施快速失败。

这可以采用 ThreadPoolExecutor 的形式(您将懒洋洋地安装在 servlet 上下文中),使用具有较小限制的阻塞队列构建,您向其提交()您的任务但处理它可以被拒绝(并向用户发送合适的消息失败)。

仔细阅读 ThreadPoolExecutor 的队列部分。

当然,您可以在 java 脚本端玩弄 onTimer() 来汇集进度,或取消(所有这些都在 运行ning 的会话中使用令牌当然是任务)。