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响应。
我想知道是否有(我肯定应该有!)比这更好的选择,因为这看起来太复杂了!
- 设置上下文为async
- 在单例bean中存储上下文
- 发送jms请求 处理jms请求
- 发送jms回复
- 从单例bean获取回复的上下文
- 发送回复给客户端
您可能想要为清理设置一个计时器,并且您可以用异步单向ejb调用