Java Servlet3.0:如何将异步处理卸载到不同的JVM?

Java Servlet3.0:如何将异步处理卸载到不同的JVM?,java,servlets,java-ee-6,distributed-computing,servlet-3.0,Java,Servlets,Java Ee 6,Distributed Computing,Servlet 3.0,Servlet3.0允许“请求”线程(或“主”线程)将长时间运行的处理委托给其他线程,以便释放自身以接收更多请求。同意。 也就是说,我们通过利用多线程来实现(请求的)可伸缩性 但这需要我的“Servlet容器JVM”能够进行这样的处理。 如果我有一个多层体系结构,其中“Servlet容器JVM”只是入口点,而服务请求的逻辑位于其他JVM中的某个地方(在本文中称为“服务JVM”),该怎么办 如果我想将传入的“请求”(或至少请求的相关属性)发布到JMS队列,并让“服务JVM”池中的一个捕获并处理“请

Servlet3.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的响应。在服务JVM执行实际处理之后,它可以将结果(通过消息或其他方式)传递给相应的工作线程,并让工作线程发送GET响应

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

  • 将上下文设置为异步
  • 在单例bean中存储上下文
  • 发送jms请求
  • 处理jms请求
  • 发送jms回复
  • 从单例bean获取回复的上下文
  • 向客户发送回复

  • 您可能需要设置一个用于清理的定时器,并且可以用异步单向EJB调用替换JMS。<您的代码> AcyCurror 是否等待JMS的响应并将其写入响应?您是否考虑使用EJB?还有一组后端服务器?Diogo,也许你的建议是对的。但是我并不精通EJB,除了一些关于EJB不好的半生不熟的知识!但也许你可以给我指出一个链接,帮助我理解EJB是如何解决这个问题的?这听起来和我在问题的最后一部分中提到的一样。i、 e两跳响应。从请求真正被处理的地方到servlet容器线程,然后到请求的实际发送者(浏览器)。我在寻找更好的选择。i、 e一个单跳响应。如果有可能的话。我认为不可能对不同的虚拟机进行一次跃点响应,因为第二个虚拟机是操作系统上的另一个进程,无法向第一个虚拟机上接收请求的同一个套接字发送字节(响应)。显然,您无法序列化套接字连接。考虑WebServices和WS-Advices,如果您想直接从处理JVM安德烈·萨米发送答复,如果可能的话,您可以PLS添加更多的语句来指导如何使用WebServices和WS-Advices来实现这一点吗?谢谢客户端必须是使用ws-addressing提供回复地址的webservices客户端。Servlet会将对adressi的回复传递给处理器,处理器使用它通过单向ws调用将回复发送回客户端。