同一容器内不同进程之间的进程间通信

11

有哪些选项可实现在同一Jetty容器中运行的两个WAR之间的低延迟通信?

我基本上需要从另一个WAR调用一个服务,但不能承受将其作为Web服务调用的开销。

由于它们在同一JVM中运行,我希望避免使用RMI/JMS等,但我不知道还有什么其他选项?

我已经研究了Servlet之间的通信,但由于直接方法调用已被deprecated,所以似乎不是正确的选择?

我也找到了kyronet,但既然这是在同一个JVM中,是否有更好的解决方案?

我正在寻找像Apache Camel的VM Componentseda在Web应用程序之间),但由于只有一个应用程序在使用Camel,因此这不是一个选项。

我知道在不同的服务之间可能需要共享一些DTO,但请不要建议将服务拉入共享库中,如果这是一个选项,我就不会问这个问题了 :) 编辑: 嵌入EJB容器也可能不是一个选项。
3个回答

5

使用JNDI注册接口,并使它们成为全局可用,以便'其他' servlet可以从存储库中检索它们。

请参阅此链接

(注意:我们放弃了JNDI,转而使用自己的注册表实现,但我们在同一个JVM中以编程方式启动注册表和Jetty)


谢谢您的回答!您为什么放弃了 Jetty 的 JNDI 支持?所以,您实现了自己的 NamingManager,但仍然使用 Context API,还是完全放弃了 JNDI?您能否指点我一些资源,描述如何在 Jetty 中以编程方式注册它?哦,最后,通过此解决方案传输的对象是通过引用传递还是序列化的? - ebaxt
我们通过“引用”传递,因此对象实例是直接可寻址的。JNDI很好:尝试使用此链接获取一些信息link。我们放弃它的原因有两个:我们想要更多的灵活性(具有固定接口、查询功能和运行时注册的多个注册表)和更精简的包(JNDI是通用的并提供了我们不需要的功能)。实现您的注册表需要正确处理Web应用程序生命周期,这可能并不容易。 - Bruno Grieder
在Jboss中如何做到同样的事情,基本上我需要了解如何将服务组件公开到JNDI? - Love Hasija

3

通过使用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 */

2

谢谢!由于我们有一个基于自定义嵌入式Jetty包装器的大型SOA部署,我不认为嵌入EJB容器会得到我的经理的支持。 - ebaxt
@ebaxt:我怀疑这完全取决于“EJB”标签及其在10年前的不良声誉。如果没有其他简单的解决方案出现,尝试一下也许是值得的。 - Michael Borgwardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接