3

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

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

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

客户端请求报告 -> Servlet 接收请求 -> Servlet 响应“报告将很快可用”

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

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

4

1 回答 1

3

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

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

    public String generateReportRequest(Object requestParameter) { .. }

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

    public boolean isReportGenerated(String uniqueID) { .. }

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

    public Object returnReport(String uniqueID) { .. }

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

如果您出于某种原因需要 Servlet,请不要创建新线程 - 阅读此答案以了解为什么在 Java EE 应用程序服务器中强烈建议不要使用它。相反,您可以使用消息驱动的 bean - 只需将请求放在消息队列中并将答案返回给客户端;MDB 将异步处理它。

第三个选项是检查Java EE 中的异步方法调用

于 2013-06-25T08:49:05.313 回答