在同一个码头集装箱内运行的两场战争之间有什么选择可以实现低延迟通信?
我基本上需要在另一场战争中调用一个服务,但不能承担将其称为Web服务的开销。
由于它们在同一个JVM中运行,我希望避免使用RMI / JMS等,但我不知道我还有其他选择吗?
我看过servlet间的通信,但直接方法调用deprecated似乎不是正确的选择?
我也找到了kyronet,但是有更好的解决方案,因为它位于同一个JVM中吗?
我正在寻找的是类似Apache Camel的VM Component(网络应用程序之间的seda),但由于只有一个应用程序使用Camel,因此不是一种选择。
我知道我可能不得不在战争之间分享一些DTO,但请不要建议将服务拉入共享库,如果这是一个选项我不会问这个问题:)
修改
嵌入EJB容器也许不是一种选择。
答案 0 :(得分:5)
向JNDI注册接口并使其成为全局接口,以便“其他”servlet可以从存储库中检索它们。
检查this
(注意:我们放弃了JNDI以支持我们自己的注册表实现,但我们在同一个JVM中以编程方式启动注册表和Jetty)
答案 1 :(得分:2)
将服务公开为具有本地接口的EJB将是一种选择。该标准不保证在跨越应用程序时将其作为直接调用实现,但apparently most app servers implement it that way。要在Jetty中运行,您必须使用可嵌入的EJB容器,例如OpenEJB,JBoss embeddable或Spring's Pitchfork。
答案 2 :(得分:2)
可以使用ServletContext.getContext(String uriPath)和RequestDispatcher(甚至是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 */