【问题标题】:Does closing the Application browser window ends the processing that was happening in Spring MVC关闭应用程序浏览器窗口是否会结束 Spring MVC 中发生的处理
【发布时间】:2022-02-04 22:17:03
【问题描述】:

在 Spring MVC 应用程序中,如果页面(浏览器窗口)在功能运行时关闭,它会停止应用程序和正在发生的处理,还是会继续在服务器上发生。

假设我有一个导出 excel 报告的功能,我点击导出按钮。现在有两种情况: 案例 1 - 如果我不使用线程启动报告生成,并在报告生成之前关闭窗口,它会抛出错误/或中止报告生成该过程是否会继续发生在服务器上并下载报告?

案例 2)如果我会使用线程启动报告生成,并在报告生成之前关闭窗口,它会抛出错误/或中止报告生成 线程会继续在后台工作并下载报告吗?

【问题讨论】:

    标签: spring multithreading spring-boot spring-mvc java-threads


    【解决方案1】:

    简短的回答是否定的,关闭浏览器选项卡或窗口不会影响服务器上正在进行的处理(除非此处理还涉及与客户端的 I/O)。

    通常,托管 Spring MVC 应用程序的 Servlet 容器(例如 Tomcat)具有内置的线程池来服务 http 请求。一旦请求到达,这些线程之一将处理它。如果与此同时,客户端关闭了 TCP 连接(希望1 在关闭浏览器选项卡或窗口时发生这种情况),则不会以任何方式通知或中断线程。因此,服务器端可能发生的任何处理都将继续。我是否使用另一个线程进行处理并不重要。在这两种情况下,服务器上的处理都将继续。

    由于您专门询问“下载”报告文件,这里有一些更多信息:下载涉及与客户端的 I/O。如果您在下载开始之前关闭选项卡或浏览器,服务器将在尝试将数据写入响应时立即收到错误消息。所以文件不会被下载,数据不会被传输。如果在下载开始后关闭选项卡,文件将正常下载。如果用户取消文件下载,那么服务器将再次出错并停止数据传输。

    无论如何,如果报告的生成发生在将数据发送回客户端之前,则无论您是否使用线程,生成都将继续在后台工作。

    1 我满怀希望地说,因为确切的行为取决于操作系统/设备/浏览器。关闭 TCP 连接将是预期的行为。

    【讨论】:

    • 嗨,您能否详细说明一下,我仍然很困惑,案例 1 - 如果我在不使用线程的情况下启动报告生成,并在报告生成之前关闭窗口,它会抛出错误还是会该过程发生在服务器中并下载报告?案例2)如果我使用线程启动报告生成,并在生成报告之前关闭窗口,它会抛出错误还是线程会继续在后台工作并下载报告?谢谢
    • 编辑了我的答案以更详细地解释。
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多