繁体   English   中英

Tomcat中的两次战争之间的互通

[英]Intercommunication between two wars in Tomcat

我有一个基本的问题,能否在同一实例上进行的两次战争之间进行通信?

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

您的两次大战都有各自的classLoader和组件,因此您无法轻松共享在其中任何一个实例化的对象。

我说您有2种典型的选择:

  1. 通过某种Web服务进行远程访问(基于套接字,RMI,HTTP等)。 它甚至允许您在不同的实例中部署战争。
  2. 使用共享组件,通常必须通过JNDI,该共享组件必须由服务器实例作为资源提供。 作为示例, 在这里查看如何使用Tomcat7进行数据源(最常见的用例)。

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

但是,我认为将您的应用程序层与不同的WAR文件解耦,而仅通过类加载器魔术(又不了解底层应用程序)再次将它们耦合在一起,可能会过大,并且过多地依赖于实现细节。

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

Liferay的服务生成器可能无法根据您的问题提出建议,它很繁重-该组件为某些API调用抽象出了不同的应用程序上下文,并使您能够透明地调用不同的应用程序。 但是,它已绑定到Liferay,这可能不是您正在寻找的解决方案。

好吧,最简单的方法可能是将共享库(jar)放在通用的类加载器中(别忘了它是lib ,可能是临时目录)。 然后,您就可以从那里获得关于所有选项的理想选择,例如BlockingQueues,Semaphores和诸如此类。 只需谨慎对待每个应用程序往返的“ Types ,以避免类强制转换异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM