【问题标题】:Get status of servlet request before the response is returned在响应返回之前获取 servlet 请求的状态
【发布时间】:2011-03-03 16:55:10
【问题描述】:

晚上好,

我正在编写一个 Java Servlet(Struts 2、Tomcat、JSP 等),它能够进行一些相当复杂的模拟。这些可能需要 2 分钟才能完成,并将返回结果图表。计算模拟完成的百分比很简单,因为该过程通过重复相同的计算 1000 次来工作。

我很想知道是否有人曾尝试使用客户端技术来估计完成百分比。即查询 servlet 处理以获取在整个模拟过程中不同点完成的周期数。然后可以在客户端浏览器中显示为条形。

任何想法、建议、资源将不胜感激。

谢谢,

亚历克斯

【问题讨论】:

    标签: java javascript jsp servlets struts2


    【解决方案1】:

    AJAX 是通往这里的道路。

    【讨论】:

      【解决方案2】:

      在您的数据库中,有一个表格来维护模拟列表以及服务器计算的进度。

      在您的 Web 应用程序中,使用 AJAX 每隔几秒查询一次服务器(我会使用 1-20,具体取决于负载)并更新图形进度条。大多数 javascript 库都有简单的基于计时器的 AJAX 函数来完成这类事情。

      有一些细节需要弄清楚,例如完成的模拟是否保留在数据库中(可能是有用的日志信息),但总的来说,这应该相当简单。

      【讨论】:

      • 感谢您的回复。没有数据库支持这个应用程序(还没有!)。计算完全在内存中完成。现在我打算返回一个 XY 图来显示结果。最终我会为用户提供一些下载结果数据的方法。
      【解决方案3】:

      您可以将您的回复封装在一个 mime/multipart 消息中并发送您的更新,直到您完成完整的回复。

      Bugzilla 在他们的搜索中使用它来显示“正在搜索...”屏幕,直到搜索结果完成。

      【讨论】:

      • +1 这具有几乎实时的进度更新的好处(考虑到良好的连接),但是,不利的一面是,如果站点流量很大,每个请求都将占用资源2 分钟,可扩展性可能是个问题。
      • 另一个缺点是,现在这确实适用于 AJAX,因为只有在请求完成时才会通知 ajax。
      【解决方案4】:

      如果你想使用普通的 Struts2,你应该看看ExecuteAndWait Interceptor

      它通过旧的 refresh-with-timeout 方法工作。当然,它比一些 AJAX 的东西具有更低的冷却系数,但它很简单并且有效(我已经使用过它)。

      Struts2 负责(通过使用此拦截器)在单独的线程中执行操作方法(这通常需要很长时间),并在工作完成之前返回特殊结果wait。你只需要编写一个jsp来显示一些“等待...”的消息,并让它重复刷新到相同的动作,(比如说)两到三秒的超时。当然,jsp 可以访问动作属性,因此您可以编写一些getProgress() 方法来显示进度消息或进度条。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 2020-04-20
        • 2021-07-27
        相关资源
        最近更新 更多