1

我有一个基本问题,是否可以在同一实例上运行的两场战争之间进行通信?

另一种方式,假设线程 A [daemon] 正在从 A.war 运行/启动,而 Thread B [daemon] 正在从 B.war 运行/启动,两个战争都部署在同一个 tomcat 实例中。我可以在线程 A 和线程 B 之间进行通信吗?如果是这样,怎么可能[链接到教程]?

4

3 回答 3

1

您的 2 场战争都有自己的类加载器和组件,因此您无法轻松共享在其中任何一个中实例化的对象。

我会说你有两种典型的方式:

  1. 通过某种 Web 服务进行远程访问(基于套接字、RMI、HTTP ......你的名字)。它甚至允许您在不同的情况下部署您的战争。
  2. 使用共享组件,该组件必须由服务器实例作为资源提供,通常通过 JNDI。举个例子,看看它是如何使用Tomcat7处理数据源的(最常见的用例)。
于 2013-06-24T13:01:43.787 回答
1

按照设计,两个 Web 应用程序由不同的类加载器分隔,并且不能访问彼此的内存/类加载器。但是,正如其他人所回答的那样,有一些解决方法 - 根据基本要求,您可能会接受各种解决方案的优缺点。

但是,我认为将您的应用程序层解耦到不同的 WAR 文件只是为了再次将它们与类加载器魔术耦合(不了解更多关于底层应用程序)可能是矫枉过正并且过于依赖实现细节。

根据您的描述,您可能可以很好地配置两个应用程序之间的 Web 服务级别访问。请参阅任何网络服务教程。或者考虑类似 MessageBus 的实现。

Liferay 的服务构建器是一个过于重量级的东西,无法根据您的问题提出建议——这是一个抽象出某些 API 调用的不同应用程序上下文的组件,使您能够透明地调用不同的应用程序。但它与 Liferay 绑定,这可能不是您正在寻找的解决方案。

于 2013-06-24T13:44:59.797 回答
0

好吧,最简单的可能工作是将共享库(jar)放在公共类加载器中(不记得它是哪个目录lib,也许)。然后,您可以随心所欲地了解您从那里获得的所有选项,例如 BlockingQueues、Semaphores 等等。只需谨慎地进出Types每个应用程序,以避免类转换异常。

于 2013-06-24T12:53:49.447 回答