在同一EAR中WAR之间进行通信的选项

时间:2008-12-11 14:34:08

标签: java web-services deployment java-ee

您有什么选择在EAR中的WAR之间进行通信? 我们有几个WAR提供在一个EAR中部署的不同Web服务。对于他们的任务,他们需要与其他WAR进行通信。当然,他们可以使用webservices进行通信。那还有什么其他的,可能更有效的选择?

编辑:沟通的原因是模块使用了一些共享功能,我们只想在一个地方找到这个功能,因为它需要大量的资源。此外,这需要同步通信。

4 个答案:

答案 0 :(得分:1)

由于您的编辑似乎暗示WARS之间实际上不需要通信,但两者都需要访问相同的共享资源。最简单的解决方案是将此资源的jar放入EAR中,并将这些jar的依赖项添加到两个Web项目中,以便它们使用共享资源。

如果两个Web项目中都有状态代码需要更新,那么您唯一的选择就是调用Web项目的servlet(假设有状态代码包含在Web项目中)。

请记住,共享资源必须是线程安全的。

类似问题here

答案 1 :(得分:1)

首先,您应该清楚自己要分享的是什么。您应该区分服务和库。 库允许您共享通用功能,这是您在使用log4j库时所实现的功能。在这种情况下,您在使用它的每个项目中设置log4j。 另一方面,您可以拥有具有自己的日志记录配置的集中式日志记录服务,并允许您在一个位置进行管理。在这种情况下,您需要共享服务。

您可以将jar放在每次战争内部或耳内。 您可以通过成为服务客户端来共享服务。因此,您的Web服务可以使用其他服务。在这种情况下,一个Web服务是另一个Web服务的客户端,实现服务组合(企业开发中的常见模式)

如果服务客户端和服务本身都位于同一个耳朵内,那么通过“直接”调用服务可以避免一些开销,例如使用Spring的父上下文功能: http://springtips.blogspot.com/2007/06/using-shared-parent-application-context.html 但我会建议不要扁平化服务,因为你将失去不同的好处,首先提供服务提供治理,可管理性等。

答案 2 :(得分:0)

有两件事情会浮现在脑海中

  1. 有用于发送信号的JMS。
  2. EJB可以记录共享信息。
  3. EAR的lib目录中的lib jar。
  4. 如果您只需要共享方法,那就是您想要的3。但是您的编辑点告诉我您已经拥有对共享数据进行操作的共享功能。例如,您拥有WAR访问和更新的用户记录。如果是这样,您需要一个EJB。

答案 3 :(得分:0)

为什么不将公共类放入JAR并直接使用它们?或者稍微更重的重量会使常见类会话bean?