我想知道如何集成作为单独的J(2)EE应用程序开发的Java模块的最佳方法。每个模块都公开Java接口。 POJO实体(Hibernate)与这些Java接口一起使用,没有DTO对象。什么是集成这些模块的最佳方式,即一个模块远程调用另一个模块接口?
我在考虑:EJB3,Hessian,SOAP,JMS。每种方法都有利弊。
伙计们,您的意见或经历是什么?
答案 0 :(得分:8)
已经涉及一些远程技术并发现它们普遍存在,我现在将使用Spring远程处理作为实现的抽象。 它允许您专注于编写功能,让Spring使用一些配置来处理远程部分。您可以选择多种实现(RMI,Spring的HTTP调用程序,Hessian,Burlap和JMS)。抽象意味着您可以选择一个实现,并在需求发生变化时简单地进行交换。 有关详细信息,请参阅SpringSource docs。
答案 1 :(得分:3)
标准方法是在各种服务组件之间使用普通RMI,但这会带来共享Java接口和版本更改到域模型的问题,特别是如果有许多组件使用相同的类。
您是否真的在单独的VM中运行每项服务?如果这些EJB总是相互通信,那么最好将它们放入同一个VM并避免任何远程过程调用,因为这些服务可以使用它们的LocalInterfaces。
可能会咬你的另一件事是使用Hibernate POJO。您可能认为这些是简单的POJO,但在幕后Hibernate一直忙于CGLib尝试执行诸如允许延迟初始化之类的操作。如果这些bean被序列化并通过远程边界传递,那么最终可能会出现奇怪的Hibernate Exception。就个人而言,我更喜欢创建简单的DTO或将POJO写为XML以在组件之间传递。我的同事们会更进一步,为了性能原因编写自定义线路协议来传输数据。
最近我一直在使用MULE ESB来集成各种服务组件。它非常好,因为您可以混合使用RMI,套接字,Web服务等,而无需编写大部分锅炉板代码。
答案 2 :(得分:2)
为什么你会选择除最简单的东西以外的任何东西?
在您的情况下听起来像EJB3或JMS,取决于通信是需要同步还是异步。
到目前为止,EJB3最容易构建在RMI之上,容器提供了您可能需要的所有其他功能 - 安全性,事务等。据推测,您的POJO位于共享jar中,因此可以简单地在EJB之间传递虽然我倾向于自己传递价值物品。 EJB的另一个好处是,如果做得对,它是最高效的(这只是我的意见btw; - )。
JMS有点参与,但并不多,基于异步通信的系统在并行化任务等方面提供了一定的细节。
Web服务的性能开销,不可避免的额外配置和额外的失败点使得他们,恕我直言,除非你有一个强制要求使用的要求,否则不值得麻烦 - 我想与非Java客户端互操作或者在这里向外部各方提供数据。
答案 3 :(得分:1)
如果您需要仅Java应用程序之间的网络通信,那么Java RMI就是您的选择。它具有最佳的集成度,最高的透明度和最低的开销。
但是,如果您的某些客户端不是基于Java的,那么您应该考虑其他选项(Java RMI实际上有一个IIOP方言,它允许它与CORBA交互,但是 - 我不建议这样做这个,除非是为了一些遗留代码集成)。根据您的需求,Web服务可能是您的朋友。如果您对网络负载有所了解,可以通过Hessian进行Web服务。
答案 4 :(得分:1)
你的意思是远程?因为在不同的环境中运行因此具有不同的可用性特征?有网络开销吗?
假设“是”,我的第一步是采取服务方法,暂时搁置调用技术。只需考虑您的服务的设计和意义。你知道调用它们会比较昂贵,因此繁忙的小接口往往是一件坏事。您知道服务系统可能在调用之间失败,因此您可能更喜欢无状态服务。您可能需要在失败后重试请求,因此您可能会支持幂等服务设计。
然后考虑可用性关系。您的客户端是否可以在没有远程系统的情在某些情况下,如果远程系统不可用,您根本无法进展(例如,如果您无法进入人力资源系统,则无法启用员工)在其他情况下您可以采用“消防通知”后来的“哲学;排队请求并稍后处理响应。
如果存在可用性倾向,那么简单地公开同步接口似乎是合适的。你可以使用SLSB EJB,如果一切都是Java EE,那就可以了。我倾向于概括地期望如果我的服务有用,那么非Java EE客户端也可能想要它们。所以SOAP(或REST)往往很有用。目前,为SLSB添加Web服务接口非常简单。
但我的宠物理论认为,任何足够大的IT系统最终都需要进行异步通信:您需要解除可用性约束。所以我倾向于寻找JMS风格的关系。在服务或SOAP / JMS之前的MDB外观并不难做到。这种方法倾向于突出可能潜伏的故障案例设计问题,JMS倾向于让你思考:“假设我没有得到答案?假设我的答案迟到了?”
答案 5 :(得分:0)
我会选择SOAP。
JMS会更高效,但您需要为每个接口编写一个消息驱动bean。
另一方面,SOAP提供了许多有用的工具包,这些工具包将在给定EJB时生成您的消息定义(WSDL)和所有必要的处理程序(客户端和服务器)。使用soap,您可以(但不必)处理证书安全性和公共网络上的安全连接。由于默认协议是通过端口80的HTTP,因此防火墙等的痛苦很小。对于在大多数常见平台上对大多数常见语言提供良好支持的hetrogenious客户端(在您的情况下,不是J2EE的任何东西),SOAP也很棒。