Tomcat中两场战争之间的相互交流

时间:2013-06-24 12:31:08

标签: java multithreading tomcat

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

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

3 个答案:

答案 0 :(得分:1)

你们的2场战争每个都有自己的classLoader和组件,所以你们不能轻易地共享在其中任何一个中实例化的对象。

我说你有两种典型的方法:

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

答案 1 :(得分:1)

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

但是,我认为将应用程序层解耦到不同的WAR文件只是为了将它们与classloader魔法再次联系起来(不知道更多关于底层应用程序的内容)可能是过度的,并且过分依赖于实现细节。

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

基于您的问题建议的重量级太重的是Liferay的服务构建器 - 这是一个组件,它抽象出某些API调用的不同应用程序上下文,并使您能够透明地调用另一个应用程序。它虽然与Liferay绑定,但这可能不是您正在寻找的解决方案。

答案 2 :(得分:0)

嗯,最简单的方法是将共享库(jar)放在公共类加载器中(不记得它是哪个目录,lib,pehaps)。然后,您可以根据自己的意愿获得所有选项,例如: BlockingQueues,Semaphores等等。只需谨慎处理你在每个应用程序中移动的Types,以避免类别转换异常。