java - 服务器忙于处理长事务时如何响应客户端

标签 java jakarta-ee asynchronous ejb

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

例如。 Client请求报告->Servlet收到请求->调用EJB处理,EJB下类后生成报告->发送response给servlet->响应Client。

但是有没有可能在servlet中一收到请求就响应用户。 例如。

Client requests report -> Servlet receives request -> Servlet responds 'Report will be available soon'

Servlet -> Calls EJB to process it , EJB generates the report after hours -> sends response to servlet ->responds to Client when client requests the report again.

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

最佳答案

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

  • 第一个收到请求,生成唯一 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 将异步处理它。

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

关于java - 服务器忙于处理长事务时如何响应客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17289143/

相关文章:

java - 如何在 recyclerview 上添加 SetOnClicklistener

java - JAX-RS 2 打印 JSON 请求

java - 如何使用 Glassfish 4 创建远程 EJB Bean?

java - 主类 JFrame 中另一个类的 JPanel 大小问题

Java servlet 异步上下文存在查询

java - 如何从计算最高数和平均值中排除某个范围内的输入数?

javascript - 如何使数据表列可点击

javascript - async.waterfall 重复调用

java - Open JDK 1.6.0_22 中的 GC 日志轮转支持

c# - 一些异步套接字代码 - 帮助垃圾收集?