|
问题:太过于关注 SOA 中的会话和实体 亲爱的 EJB 倡导者: 到目前为止您的专栏全部都是关于服务的会话和实体 EJB,它对于直接连接 Java 应用程序是很重要的,例如基于 Web 客户端的 HttpServlets 或富(我们不喜欢说“胖”)客户端的 Swing 应用程序。但我们曾听说面向服务的体系结构都是与松耦合有关的。这不就意味着要尽可能地使用 SOAP 来提供使客户端和服务器应用程序能够独立运行的语言中立性和异步协议?换句话说,为什么您对 JMS 和消息驱动 Bean 讨论得不多呢? 署名: Feeling Disconnected 对松耦合有许多方面要考虑 亲爱的 Disconnected: EJB 倡导者关注的是应用程序的服务层,而对客户端介绍得很少,因为我对古谚语形式追随功能 (form follows function) 深信不疑。 其原因在于,许多进行 SOA 的项目之所以失败,是因为它们没有首先建立定义服务的良好模型就开始着手实现细节。 这种倾向相当正常,因为我在 SOA 项目中接触到的大多数人都是架构师和编程人员,他们知道棘手的始终是在细节上,想要尽快解决它们。所以,一旦我们认同好服务的特征是粗粒度、无状态、可通过中介传递和适应的(请参阅 Is it ever best to use EJB components without facades in service oriented architectures?),很明显带有数据传输对象的会话 Bean 就会在实现中扮演重要角色。 但上期专栏介绍了使用实体 Bean 及其 Home 方法代替会话 Bean 的可能性,从而使人们对会话 Bean 是否真的是必需的产生了疑问。图 1 显示了同时使用的两种方法。 图 1. 用有待使用的会话和实体 EJB 实现的服务
图 1 显示了当使用传递过去的会话 Bean 时,纯实体方法(自 EJB 2 开始可用)如何才能有更少的组件和更短的路径长度。其中使用绿色框表示客户端,蓝色框表示各种接口和 Facade 类。橙色框是最常访问的实体 Bean。框和框之间使用双向箭头连接,箭头标有在组件之间通信所使用的协议;蓝色箭头表示相同 JVM 中的 Java 调用,红色箭头表示远程连接(在本例中使用 RMI/IIOP)。为了表示端到端的流向,对流程箭头进行编号,其中 A1-A10 表示从 Java 客户端经过会话 Bean 到实体和返回的流程,B1-B4 表示从客户端直接到实体 Bean 和返回的流程。 客户端用于检索服务接口的编程模型也很简单,虽然在图中没有表示出来。检索会话 Bean 接口需要在 JNDI 上下文中查找会话 Home 并用它创建一个会话;实体 Home 仅仅需要一次查找,其方法可以直接调用而不需要创建对 EJB Object 的引用。以下两段代码示例显示了它们之间的区别。
1
2
3
4
下一页>>
|