Servlet 3.0 允许“请求”线程(或“主”线程)将长时间运行的处理委托给其他线程,以便释放自己以接收更多请求。同意。也就是说,我们正在通过利用多线程来实现(请求的)可伸缩性。
但这要求我的“Servlet 容器 JVM”能够进行此类处理。如果我有一个多层架构,其中“Servlet 容器 JVM”只是入口点,而服务请求的逻辑位于其他 JVM 中的其他地方(在本文中称为“服务 JVM”),该怎么办?
如果我想将传入的“请求”(或至少请求的相关属性)发布到 JMS 队列并让“请求”被“服务 JVM”池中的一个抓取和处理怎么办?将发送“响应”(例如 JSON)的责任也委托给该服务 JVM 会更好吗?
我认为“AsyncContext”不能在 Servlet 容器 JVM 之外有意义地传递。那么,如何真正委派请求处理和响应发送,由分布式服务 (JVM) 完成?
在代码/伪代码方面,我的问题是:
@WebServlet(urlPatterns = "/AsyncServlet", asyncSupported=true)
public class AsyncServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
AsyncContext asyncCtx = request.startAsync();
// Put the asyncCtx in a JMS queue so as to be picked by another
// service JVM that can really service this request.
// return back to receiving requests and dont worry abt sending a response
// The service JVM will take care of sending the appropriate response
// as it has the data necessary for the response.
}
}
一种选择似乎是让工作线程(在 Servlet 容器 JVM 中)等待来自服务 JVM 的响应。在 Service JVM 进行实际处理之后,它可以将结果(通过消息或其他方式)传达给相应的 Worker 线程,并让 Worker 线程发送 GET 响应。
我想知道是否有(肯定有!)比这更好的选择,因为这看起来很复杂!