我有一个基本问题,是否可以在同一实例上运行的两场战争之间进行通信?
另一种方式,假设线程 A [daemon] 正在从 A.war 运行/启动,而 Thread B [daemon] 正在从 B.war 运行/启动,两个战争都部署在同一个 tomcat 实例中。我可以在线程 A 和线程 B 之间进行通信吗?如果是这样,怎么可能[链接到教程]?
我有一个基本问题,是否可以在同一实例上运行的两场战争之间进行通信?
另一种方式,假设线程 A [daemon] 正在从 A.war 运行/启动,而 Thread B [daemon] 正在从 B.war 运行/启动,两个战争都部署在同一个 tomcat 实例中。我可以在线程 A 和线程 B 之间进行通信吗?如果是这样,怎么可能[链接到教程]?
您的 2 场战争都有自己的类加载器和组件,因此您无法轻松共享在其中任何一个中实例化的对象。
我会说你有两种典型的方式:
按照设计,两个 Web 应用程序由不同的类加载器分隔,并且不能访问彼此的内存/类加载器。但是,正如其他人所回答的那样,有一些解决方法 - 根据基本要求,您可能会接受各种解决方案的优缺点。
但是,我认为将您的应用程序层解耦到不同的 WAR 文件只是为了再次将它们与类加载器魔术耦合(不了解更多关于底层应用程序)可能是矫枉过正并且过于依赖实现细节。
根据您的描述,您可能可以很好地配置两个应用程序之间的 Web 服务级别访问。请参阅任何网络服务教程。或者考虑类似 MessageBus 的实现。
Liferay 的服务构建器是一个过于重量级的东西,无法根据您的问题提出建议——这是一个抽象出某些 API 调用的不同应用程序上下文的组件,使您能够透明地调用不同的应用程序。但它与 Liferay 绑定,这可能不是您正在寻找的解决方案。
好吧,最简单的可能工作是将共享库(jar)放在公共类加载器中(不记得它是哪个目录lib
,也许)。然后,您可以随心所欲地了解您从那里获得的所有选项,例如 BlockingQueues、Semaphores 等等。只需谨慎地进出Types
每个应用程序,以避免类转换异常。