RMI-IIOP与JNDI简单小结
Java RMI-IIOP(java remote method invocation over the internet inter-ORB protocol),如果使用过RMI,就应该很清除RMI是Java执行远程方法调用的方式,而RMI-IIOP则是RMI的功能扩展版本,增加了如:分布式垃圾收集,对象活化,可下载类文件等,所以你可以把RMI理解成为RMI-IIOP的简化版本,在分布式对象方法调用上他们都完成了最基本的功能。
J2ee中强制使用RMI-IIOP,所以你在RMI-IIOP和RMI中没有的选择
为了便于理解,先介绍一些基本概念:
-RPC(远程过程调用) 是从一个机器上的过程启用另一个机器上的过程
-接口 定义对象所公开的信息
-实现 是由对象提供的核心逻辑程序
-RMI 所有网络代码都是应用于接口的,而不是执行代码,换句话说,就是所有的网络代码都是提供给远程过程调用的。
那么RMI-IIOP是怎样完成远程方法调用的呢?
RMI-IIOP的目的其实很明确,就是在调用远程机器上的对象时就像调用任何其他的Java对象一样,视网络的存在为一种透明。RMI-IIOP是如何实现这一功能的呢?很简单,RMI-IIOP把远程对象的调用模拟成本地对象的调用,即所谓的根程序(stub),根程序负责接收对象方法的本地调用,由于本地通过根程序调用,所以网络的复杂问题都被隐藏在它后面了;那么远程对象如何处理能让调用它的机器得到对应的实现呢?其实处理的方式和客户机一样,远程对象通过一个所谓的程序框架(Skeleton)负责接收网络传发过来的调用。如此以来远程调用的过程其实就发生在根程序和程序框架之间,关于他们是由RMIC(RMI编译器)来生成,具体的实现过程我们就不用管了。根程序和程序框架的功能是处理参数,而参数由如何传送呢?
可能你曾听说过对象序列化的概念,顾名思义,把对象变成能在网络上传输的一些有序信号,这就涉及到如何变,又如何还原的问题了,即所谓的编组和解组的问题。我们首先来看看参数传递吧!当调用方法时,有两种主要的传递参数的方法,值传递和引用传递。值传递是当产生调用过程时,远程主机先实例化一个对象T的一个新拷贝T1,然后可能修改这个拷贝的值T2,此时对象T是不会发生变化的,然后把需要的对象T2从远程传回来;而引用是对原对象T的远程引用,并不是对象引用的一个拷贝,所以当可能修改远程引用为T2时,远程对象也从T变成了T2,这个引用使用一个引用传递调用的协定完成,这于Java语言不同,Java中的用一个对象参数正常的调用一个方法时,拷贝的是对象的引用而不是对象的真实数据,这里一定要注意理解哦。接下来的问题又出来了,一个对象通过网络传递了,但该对象引用了其他对象,并不只孤身一个,那么在目标机上怎样处理呢?目标机的内存地址可不会和引用的机器内存地址映射啊!这就轮到对象序列化上场了,可见每一种技术的产生都是为了处理新的问题,但是人类往往是新问题处理了又会凭空增加新问题处理以后的问题,所以做人辛苦呢,可能一生都在问题中处理着,这让我想到了庄子随意之态,如果我们不去处理问题,问题永远仅仅就那么点,也不会有新问题,更不会越来越复杂,不知道那个时候的世界会是什么样子!瞎扯了,言规正转,刚才说道对象序列化,其实很简单,就是将一个Java对象转化为一个描述该对象的位块(bit-blob),对象变成位块时就可以随意的传了,其实也就是把一系列Java引用打包了,怎样序列化,我想你应该很清楚吧,就是实现java.lang.Serializable接口,做到这一步就可以了,Java会处理余下可序列化和解序列化的问题了。
小结一下:当远程调用时,所有的JAVA简单的基本类型都是用值传递,即参数拷贝传递,不影响原始数据,要用值传递必须实现java.lang.Serializable接口。如果要使用引用传递就必须实现java.rmi.remote,该对象的根程序将被序列化传给远程主机,然后就可以根据根程序来请求远程对象了,任何时候根程序所持有的数据都是同远程主机相同的。解决了远程调用的问题,下一部就是需要远程调用的客户由如何定位远程主机呢?