在同一码头集装箱中运行的两场战争之间,有哪些选项可以实现低延迟通信?
我基本上需要在一场战争中从另一场战争调用一个服务,但负担不起将其作为web服务调用的开销。
由于它们在同一JVM中运行,我希望避免使用RMI/JMS等,但我不知道我还有什么其他选择?
我已经研究了servlet之间的通信,但由于直接方法调用已被弃用,所以这似乎不是正确的选择?
我也找到了kyronet,但由于它在同一JVM中,有更好的解决方案吗?
我想要的是类似ApacheCamel的VM组件(web应用程序之间的seda),但由于只有一个应用程序使用Camel,所以这不是一个选项。
我知道我可能不得不在战争之间共享一些DTO,但请不要建议将服务拉到共享库中,如果可以的话,我不会问这个问题:)
编辑:
嵌入EJB容器可能也不是一个选项。
使用JNDI注册接口,并使它们成为全局接口,以便"其他"servlet可以从存储库中检索它们。
检查此
(注意:为了支持我们自己的注册表实现,我们放弃了JNDI,但我们在同一JVM中以编程方式启动注册表和Jetty)
使用ServletContext.getContext(String-uriPath)和RequestDispatchers(甚至ServletContext侦听器)可以在两个位于同一位置的web应用程序之间"通信"。
以下是工作代码。Peer Reynders建议(http://www.coderanch.com/t/222608/Web-Services/java/communicate-war-files)
public void doGet(HttpServletRequest Prequest, HttpServletResponse Presponse)
throws IOException, ServletException {
ServletContext sc = getServletContext().getContext("/war2");
RequestDispatcher rd = sc.getRequestDispatcher("/LoginHandler?UserId=DummyUser");
rd.forward(Prequest, Presponse);
} /* End of doGet */
将服务公开为具有本地接口的EJB是一种选择。该标准并不保证在跨应用程序执行时会作为直接调用来实现,但显然大多数应用程序服务器都是这样实现的。为了在Jetty中运行,您必须使用一个可嵌入的EJB容器,如OpenEJB、JBoss-embeddeable或Spring的Pitchfork。