24.9 选择技术时的注意事项

这里提到的每种技术都有它的缺点。你在选择一种技术时,应该仔细考虑你的需要和所暴露的服务及你在远程访问时传送的对象。

当使用RMI时,通过HTTP协议访问对象是不可能的,除非你正在HTTP通道传输RMI流量。RMI是一种重量级协议,因为它支持整个对象的序列化,当要求网络上传输复杂数据结构时这是非常重要的。然而,RMI-JRMP与Java客户端相关:它是一种Java-to-Java的远程访问解决方案。

如果你需要基于HTTP的远程访问而且还要求使用Java序列化,Spring的HTTP调用器是一个不错的选择。它和RMI调用器共享相同的基础设施,只需使用HTTP作为传输。注意HTTP调用器不仅限于Java-to-Java的远程访问,而且还限于使用Spring的客户端和服务器端。(后者也适用于Spring的RMI调用器,用于非RMI接口。)

Hessian可以在异构环境中运行时提供重要的价值,因为它们明确允许非Java客户端。然而,非Java支持仍然有限。已知问题包括将Hibernate对象与延迟初始化的集合相结合的序列化。如果您有这样的数据模型,请考虑使用RMI或HTTP调用者而不是Hessian。

在使用服务集群和需要JMS代理(JMS broker)来处理负载均衡及发现和自动-失败恢复服务时JMS是很有用的。缺省情况下,在使用JMS远程服务时使用Java序列化,但是JMS提供者也可以使用不同的机制例如XStream来让服务器用其他技术。

最后但并非最不重要的是,EJB比RMI具有优势,因为它支持标准的基于角色的身份认证和授权,以及远程事务传递。用RMI调用器或HTTP调用器来支持安全上下文的传递是可能的,虽然这不由核心core Spring提供:Spring提供了合适的钩子来插入第三方或定制的解决方案。