对于Java应用程序,您推荐哪种远程处理方法?

对于Java应用程序,您推荐哪种远程处理方法?,java,remoting,Java,Remoting,我想知道集成作为独立的J(2)EE应用程序开发的Java模块的最佳方法是什么。这些模块中的每一个都公开了Java接口。POJO实体(Hibernate)与这些Java接口一起使用,没有DTO对象。集成这些模块(即一个模块远程调用另一个模块接口)的最佳方式是什么 我在考虑:EJB3、Hessian、SOAP、JMS。每种方法都有利弊 各位,你们的看法和经历是什么?我喜欢肥皂 JMS将更加高效,但您需要为每个接口编写一个消息驱动bean 另一方面,SOAP附带了许多有用的工具包,当给定EJB时,这些

我想知道集成作为独立的J(2)EE应用程序开发的Java模块的最佳方法是什么。这些模块中的每一个都公开了Java接口。POJO实体(Hibernate)与这些Java接口一起使用,没有DTO对象。集成这些模块(即一个模块远程调用另一个模块接口)的最佳方式是什么

我在考虑:EJB3、Hessian、SOAP、JMS。每种方法都有利弊

各位,你们的看法和经历是什么?

我喜欢肥皂

JMS将更加高效,但您需要为每个接口编写一个消息驱动bean

另一方面,SOAP附带了许多有用的工具包,当给定EJB时,这些工具包将生成您的消息定义(WSDL)和所有必要的处理程序(客户端和服务器)


使用soap,您可以(但不必)处理公共网络上的证书安全和安全连接。由于默认的协议是HTTP over port 80,因此您在防火墙等方面的痛苦最小。SOAP对于异构客户端(在您的情况下,任何不是J2EE的客户端)来说都是非常好的,并且在大多数通用平台上都能很好地支持大多数通用语言。

如果您需要纯Java应用程序之间的网络通信,Java RMI是一种不错的选择。它具有最好的集成、最透明和最少的开销


如果你的一些客户不是java的,你应该考虑其他选项(java RMI实际上有一个IIOP方言,它允许它与CORBA交互,但是我不建议这样做,除非它是为了一些遗留代码集成)。根据您的需要,Web服务可能是您的朋友。如果您对网络负载感兴趣,您可以通过Hessian访问Web服务。

您的字面意思是远程?在具有不同可用性特征的不同环境中运行?网络开销

假设“是”,我的第一步是采用服务方法,暂时搁置调用技术。请考虑服务的设计和意义。您知道调用它们的代价相当昂贵,因此小型繁忙接口往往是一件坏事。您知道服务系统可能在两次调用之间失败,因此您可能喜欢无状态服务。您可能需要在失败后重试请求,因此您可能倾向于幂等服务设计

然后考虑可用性关系。您的客户端在没有远程系统的情况下是否可以工作。在某些情况下,如果远程系统不可用,您根本无法取得进展(例如,如果无法进入人力资源系统,则无法启用员工)。在其他情况下,您可以采用“稍后通知我”的理念;将请求排队,稍后处理响应

如果存在可用性问题,那么简单地公开一个同步接口似乎是合适的。如果一切都是JavaEE,那么可以通过SLSBEJB实现。我倾向于概括地认为,如果我的服务有用,那么非JavaEE客户机也可能需要它们。所以SOAP(或REST)往往是有用的。如今,将web服务接口添加到SLSB非常简单


但我最喜欢的理论是,任何足够大的IT系统最终都需要aynch通信:您需要将可用性约束解耦。所以我倾向于寻找JMS风格的关系。服务前面的MDB门面或SOAP/JMS并不难做到。这种方法倾向于突出可能潜在的失败案例设计问题,JMS倾向于让您思考:“假设我没有得到答案?假设我的答案来得晚?”

标准方法是在各种服务组件之间使用普通RMI,但这会带来共享Java接口和对域模型进行版本控制更改的问题,特别是如果有许多组件使用相同的类

您真的在一个单独的VM中运行每个服务吗?如果这些EJB总是相互通信,那么最好将它们放在同一个VM中,避免任何远程过程调用,因为这些服务可以使用它们的LocalInterface

另一件可能会伤害你的事情是使用Hibernate POJOs。您可能认为这些是简单的POJO,但在幕后Hibernate一直忙于CGLib,试图做一些事情,比如允许延迟初始化。如果这些bean被序列化并通过远程边界传递,那么最终可能会出现异常的Hibernate异常。就我个人而言,我更喜欢创建简单的DTO,或者将POJO编写成XML在组件之间传递。我的同事会更进一步,出于性能原因,编写用于传输数据的自定义有线协议

最近,我一直在使用MULE ESB集成各种服务组件。这非常好,因为您可以混合使用RMI、套接字、web服务等,而无需编写大多数锅炉板代码


除了最简单有效的东西,你为什么还要选择其他东西

在您的例子中,这听起来像EJB3或者JMS,这取决于通信需要是同步的还是异步的

到目前为止,EJB3是在RMI之上构建的最简单的工具,容器提供了您可能需要的所有附加功能—安全性、事务等。您的pojo可能位于共享jar中,因此可以在ejb之间简单地传递,尽管我本人倾向于传递值对象。EJB的另一个好处是,如果做得好,它的性能最好(顺便说一句,这只是我的观点;-)

JMS稍微复杂一些,但并不多,基于异步通信的系统在并行任务等方面提供了某些细节

web服务的性能开销、不可避免的额外配置和额外的故障点,IMHO,使它们不值得麻烦,除非您