Servlet 3.0:如何将异步处理卸载到不同的JVM



Servlet 3.0允许'request'线程(或'main'线程)将长时间运行的处理委托给其他线程,以便释放自己来接收更多的请求。同意了。也就是说,我们通过使用多线程实现了(请求的)可伸缩性。

但是这要求我的"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.
    }
}

一个选项似乎是让Worker线程(在Servlet容器JVM中)等待来自Service JVM的响应。Service JVM完成实际处理后,它可以将结果(通过消息或其他方式)传递给各自的Worker线程,并让Worker线程发送GET响应。

我想知道是否有(我肯定应该有!)比这更好的选择,因为这看起来太复杂了!

  1. 设置上下文为async
  2. 在单例bean中存储上下文
  3. 发送jms请求
  4. 处理jms请求
  5. 发送jms回复
  6. 从单例bean获取回复的上下文
  7. 发送回复给客户端

您可能想要为清理设置一个计时器,并且您可以用异步单向ejb调用

替换jms

最新更新