11

有哪些选项可以在同一码头容器中运行的两场战争之间实现低延迟通信?

我基本上需要在一场战争中从另一场战争中调用一项服务,但不能承担将其作为 Web 服务调用的开销。

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

我已经查看了 servlet 间通信,但是由于不推荐使用直接方法调用,这似乎不是正确的选择?

我也找到了 kyronet,但是有没有更好的解决方案,因为它在同一个 JVM 中?

我正在寻找的是类似于 Apache Camel 的VM 组件( web 应用程序之间的seda),但由于只有一个应用程序使用 Camel,因此这不是一种选择。

我知道我可能不得不在战争之间分享一些 DTO,但请不要建议将服务拉入共享库,如果这是一个选项,我不会问这个问题:)

编辑:

嵌入 EJB 容器也可能不是一种选择。

4

3 回答 3

5

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

检查这个

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

于 2012-03-20T17:13:05.480 回答
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 */
于 2013-10-31T08:21:32.337 回答
2

将服务公开为具有本地接口的 EJB 是一种选择。该标准不保证在跨应用程序完成时这将作为直接调用实现,但显然大多数应用程序服务器都是以这种方式实现的。要在 Jetty 中运行,您必须使用可嵌入的 EJB 容器,例如OpenEJBJBoss embeddableSpring 的 Pitchfork

于 2012-03-20T09:19:00.060 回答