我使用 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/