【问题标题】:How to respond to client when the server is busy processing a long transaction服务器忙于处理长事务时如何响应客户端
【发布时间】:2013-06-25 04:23:36
【问题描述】:

我使用 Servlet/EJB 模型。当用户请求他过去交易的报表报告时,服务器需要几个小时才能生成报告。因此,在处理请求之前,不会从服务器发送响应。

例如。 客户端请求报告 -> Servlet 接收请求 -> 调用 EJB 进行处理,EJB 下班后生成报告 -> 向 servlet 发送响应 -> 响应客户端。

但是是否有可能在 servlet 中收到请求后立即响应用户。 例如。

客户端请求报告 -> Servlet 接收请求 -> Servlet 响应 '报告即将发布'

Servlet -> 调用 EJB 处理它,EJB 生成报告 下班后 -> 向 servlet 发送响应 -> 在何时响应客户端 客户再次请求报告。

也就是说,我可以从 Servlet 创建一个线程并使用它来调用 EJB,而 Servlet 会响应用户说明请求将很快处理

【问题讨论】:

    标签: java jakarta-ee asynchronous ejb


    【解决方案1】:

    您的场景需要异步通信。也就是说,您应该重写您的应用程序以使用三种不同的方法:

    • 第一个接收请求,生成唯一ID,立即返回给客户端并调用EJB生成报告;它的签名是这样的:

      public String generateReportRequest(Object requestParameter) { .. }

    • 第二个接收一个唯一的 ID 并与 EJB 检查报告生成是否完成;它的签名是:

      public boolean isReportGenerated(String uniqueID) { .. }

    • 第三个实际返回报告,但只有当第二个返回报告准备好时才应该调用它:

      public Object returnReport(String uniqueID) { .. }

    由于我们要处理三种方法,我不建议混合使用 servlet 和 EJB,而是将 EJB 转换为 Web 服务,如果合适的话(只需使用 @WebService 注释来注释您的无状态 bean 并调整客户端)。

    如果您出于某种原因需要 Servlet,请不要创建新线程 - 阅读 this answer 以了解为什么 Java EE 应用程序服务器不鼓励使用它。相反,您可以使用message-driven beans - 只需将请求放在消息队列中并将答案返回给客户端即可; MDB 将对其进行异步处理。

    第三个选项是在 Java EE 中检查 asynchronous method invocation

    【讨论】:

    • 谢谢您,先生,我能够通过“异步方法调用”解决这个问题,先生。感谢您的解决方案
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2020-06-09
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多