版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://www.onjava.com/pub/a/onjava/2003/08/27/cocktails.Html
中文地址:
http://www.matrix.org.cn/resource/article/43/43781_Jini_J2EE.html
关键词: Jini J2EE Web
编辑说明:Kathy Sierra 和Bert Bates是O’Reilly的Head First系列的后台智囊。他们第一次写这篇文章是在2003年Head First Java发行的那时候。这本书变得十分流行,我们现在仍然收到订单。如此多的订单让我们决定重新带给读者,这就导致Head First Java,2nd Edition的发行。所以如果第一次发行的时候你没赶上,现在就让Kathy和Bert告诉你如何与Java初学者交谈。
这些都是可以预测到的:当你在一个宴会中,喝着次等的马提尼酒,不可避免的就会谈到分布式编程。怎么办?放松点,因为在这里我们会解决3种最有意思的分布式编程,就在用完的餐巾上画图,你可以用来提高你的 whuffie. (不知道 whuffie是什么? 读读 Richard Koman's interview with Cory Doctorow.)
但是首先,万一你真的现在就在某个宴会上,我们首先从几个即使你不懂Java也可以使用的短语。然后,对于那些确实知道一些Java技术的人,我们会谈得更深入一点。
“什么是动态发现?你知道,它的含义就是在网络上,尽管客户端和服务事先对对方一无所知,但能动态地发现对方。这所有都是基于ip广播的。”
“什么是自动诊断网络 (self-healing network) 呢?它指Jini网络总是能够反映当前所有可用的服务的状态--就像这样:‘OK,这个服务起来了,那个服务当掉了……’没有任何人的管理!”
当然,大多数路由器禁止了IP广播,所以你不准备在web上用Jini。但是Jini是为本地网络的工作,或者本地网络的集合而设计的,所以这并不是个大问题。
“J2EE最酷的东西是提供商独立,你可以专心于你的商业逻辑,将那些重担交给厂商。你可以在你特殊的商业规则上工作,把那些安全,事务,并行,持久化,甚至网络代码实现的任务交给服务器。而你只需要去学一个API,你可以重新部署你的J2EE程序给所有厂商的与J2EE兼容的服务器。所以现在厂商必须改变以前那种将你锁起来,并且你必须乞求厂商添加新的功能以解决bugs的方式。”
“Web服务中酷的东西是…嗯,OK,也许现在的情况Web services没有什么真正酷的东西。但是会变的,就在不久的未来,当所有标准都提出,工具成熟了,以及….”
“但是如果要说Web 服务酷,这也许因为你可以采用你已有的商业程序,甚至旧的程序,让他们通过xml那样的接口暴露在Web上。客户端通过可互操作的方式发送一个XML信息(通过一种叫SOAP的格式)给服务。”
“安全和事务是现在Web服务的两个明显的缺陷,这意味着所有人必须加入自己的解决方案。在Web上没有足够的事务管理设置,而你所拥有的唯一的安全是互动验证 (mutual authentication) 的Https。”
“Jini和J2EE都是Java技术。通过J2EE,就像规格说明说的那样:“哦,你不需要担心你这个小程序员去解决那些巨大的困难的东西。厂商会考虑这些问题,而你可专注于自己的特殊领域的需要(比如,如何卖出更多的妇女内衣)。但是,通过Jini,就好像规格说明说的那样:‘你必须靠自己,别指望其他人使用许多基础设施来救你。这是贫乏而又简陋的,宝贝,但你可以做最令人惊讶和体面的事情。当你在那时,检验一下Javaspaces。’”
“Web服务不是针对于java的技术,但是java可以让其更容易的使用,特别是如果你去使用J2EE 1.4。不,你说的对。J2EE 1.4还没发布,但是会在今年年底发布,你将在2004年初见到许多厂商支持。”
(在我们继续下去之前,先提出一些免责声明:首先,如果你对于这篇文章的高级含义有任何问题,重新读一下标题。对于这些内容我们有酒吧侍应的牌照,我们不会告诉你什么是错的,但是你也不会试图去了解整个故事。每个主题都需要相应的一本书(但如果我们不说出任意一本书来,这是很可恨的。比如,Head First EJB,或是哪一本呢?)让我们仅仅通过鸡尾酒会的观点来看这个问题并不是你想来操纵你的下个结构。(我们知道你知道这些,但对于那些可能会误解这篇文章是篇严肃的技术论文的人,我感到有必要谈谈我们的a**es).)[原文如此]
所以现在是时候进入下一个层次了。我们将首先开始看看什么是服务,而且更重要的是如何向别人显现你自己。换种说法,你如何将你的服务告诉你潜在的客户呢?
通过Jini,J2EE,和Web service,目的是让客户去访问服务。什么是服务呢?你所能做的事就是将消息从一个软件传递给另一软件(也许包含人工指向,也许也不包含)。你也许有一个为基因匹配进行大规模计算的服务。或者一个玩简陋的Go游戏的服务。或者一个让你买演唱会门票的程序。或者预定异国热带风情的巡游。或者甚至将你的文字传递给一台高容量(high-volume)打印机。换种说法,服务就是所有像软件一样开始但是结果并不一定留存在软件中的东西。
你也许有个服务来移动摄像机,利用打印机打印,拨电话。没关系。或者至少没关系。主要目标之一,就像OO的任何情况下的目标一样,尽可能减少耦合,—此例中,即客户端和服务器端之间的耦合。换种说法就是我们要让那些参与者(客户端和服务端)尽可能地少了解对方。
但是让我们说说你有一个服务…现在怎么办?客户端如何找到你?如果他们找到你,他们怎么知道你的服务可以干什么?换种说法,他们如何知道他们调用你的服务的方法?这样,你必须将你自己暴露给客户,我们的3种技术在这方面稍有不同。不考虑我们在讨论Jini,J2EE,或者Web服务,可是必须在某个地方有个接口。这个接口说明了你可以做的东西。
1. 扩展 java.rmi.Remote
2. 为每个方法声明java.rmi.RemoteException
1. public interface Advice
2. extends java.rmi.Remote {
3.
4. String getAdvice() throws
5. java.rmi.RemoteException;
6.
7. }
1. 实现你的Remote接口
2. 为接口方法写真正的商业逻辑
1. public class AdviceImplementation implements Advice {
2.
3. public String getAdvice() {
4.
5. // monumentally important
6. business logic here
7.
8. }
9.
10. }
(OK,所以代码对于鸡尾酒会有点多,因为在这都是初学者….)
所有东西的关键:The Stub
当你已经有了接口和类,你通过RMI编译器(rmic)运行你的类,RMI编译器已在J2SE中(如果你已经有javac,你就有rmic了)。那个程序建立了stub这个你可以几乎在所有现代分布式编程模型中发现的东西。Stub仅是客户端的助手,通过像服务那样实现远程接口来扮演远程对象的角色。但是事实上,Stub仅是一个取得方法调用,打包,并通过网线传递给真正的远程对象的小对象。或者说, stub知道如何打电话回家并叫真正的服务去做真正的工作。
Stub所有方法都是虚假的。他们是方法,有一大堆代码,包括用于服务联系的网络和I/O内容。但是他们并不是真正的商业代码。所以对于Advice服务, stub有getAdvice()方法,但是这个方法仅仅从客户的请求传递给在服务器上真正的AdviceImplementation。
那边,客户端假装他在调用远程对象,但是我们知道由于远程对象运行于不同的JVM堆中这并不真正发生。
(是的,在服务器端依然有些东西接受来自客户的Socket连接,解包方法调用,打包并装载返回值等等。但是我们并不准备在这篇文章中谈论这些。那是个更微不足道的过程,因为你不需要担心传递功能给客户。所以在服务器上Stub的功能有同伴,但是你并不需要担心这个。)
RMI基本结构
籍由rmi,远程对象是一个服务。
(出处:http://www.VeVb.com)
新闻热点
疑难解答