Transcript downloading

RMI规范及PKUAS通讯框架简
介
关于RMI

分布式计算




一种程序设计模式,其中的程序、处理的数据和实
际的计算都广泛的分布在网络上
允许远程获得商业逻辑和数据
分布式对象技术: CORBA, Java RMI,DCOM
RMI:Java Remote Method Invocation( Java远
程方法调用)


Java的RPC机制,使用Java编写分布式对象,使它
们能在不同的JVM之间进行通讯
优点:1.面向对象;2.可移动属性;3.安全;4.可
连接现有/原有的系统;5.分布式垃圾收集;6.并
行计算;7.便于编写和使用
RMI规范

Java分布式对象模型


服务器程序和客户机程序
分布式对象应用程序


定位远程对象
与远程对象通讯
RMI规范

RMI的接口和类



Java.rmi.Remote接口
Java.rmi.RemoteException类
java.rmi.server.RemoteObject类和它的子类
java.rmi.server.RemoteServer、
java.rmi.server.UnicastRemoteObject
和 java.rmi.activation.Activatable
RMI规范

实现远程接口


RMI的参数传递





扩展UnicastRemoteObject类,实现对应的远程接口
中的方法
传递非远程对象
传递远程对象
引用的完整性
参数传输
定位远程对象

Java.rmi.Naming类
RMI规范

Stub与skeleton





Stub (客户端):远程对象的客户本地代理。
调用Stub执行的操作
Skeleton(服务器端):将调用分配给实际的
远程对象实现。(JDK1.2中已不需要)
Stub与Skeleton的生成:rmic编译器生成
动态类加载
RMI规范

客户端程序



java.rmi.server.UnicastRemoteObject 和
java.rmi.activation.Activatable。
RemoteException 类
java.rmi.Naming 类
RMI规范

客户端的例子
package Client;
import java.rmi.Naming;
import remote.TestInterfaceRemote;
public class Client {
public static void main(String args[]) {
try {
TestInterfaceRemote testInterfaceRemote = (TestInterfaceRemote)
Naming.lookup("rmi://10.0.0.123/server");
System.out.println(testInterfaceRemote.add("rmi a ", "rmib"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI规范

服务器端程序

RemoteObject类
package java.rmi.server;
public abstract class RemoteObject implements java.rmi.Remote,
java.io.Serializable {
protected transient RemoteRef ref;
protected RemoteObject();
protected RemoteObject(RemoteRef ref);
public RemoteRef getRef();
public static Remote toStub(java.rmi.Remote obj) throws
java.rmi.NoSuchObjectException;
public int hashCode();
public boolean equals(Object obj);
public String toString();
}
RMI规范

服务器端程序

RemoteServer类
package java.rmi.server;
public abstract class RemoteServer extends RemoteObject {
protected RemoteServer();
protected RemoteServer(RemoteRef ref);
public static String getClientHost() throws
ServerNotActiveException;
public static void setLog(java.io.OutputStream out);
public static java.io.PrintStream getLog();
}
RMI规范

服务器端程序

UnicastRemoteObject类
package java.rmi.server;
public class UnicastRemoteObject extends RemoteServer {
protected UnicastRemoteObject() throws java.rmi.RemoteException;
protected UnicastRemoteObject(int port) throws java.rmi.RemoteException;
protected UnicastRemoteObject(int port, RMIClientSocketFactory csf,
RMIServerSocketFactory ssf) throws java.rmi.RemoteException;
public Object clone()throws java.lang.CloneNotSupportedException;
public static RemoteStub exportObject(java.rmi.Remote obj)
throws java.rmi.RemoteException;
public static Remote exportObject(java.rmi.Remote obj, int port)
throws java.rmi.RemoteException;
public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory
csf, RMIServerSocketFactory ssf) throws java.rmi.RemoteException;
public static boolean unexportObject(java.rmi.Remote obj, boolean force)
throws java.rmi.NoSuchObjectException;
}
RMI规范

服务器端程序

RMIClassLoader类
package java.rmi.server;
public class RMIClassLoader {
public static String getClassAnnotation(Class cl);
public static Object getSecurityContext(ClassLoader loader);
public static Class loadClass(String name)
throws java.net.MalformedURLException, ClassNotFoundException;
public static Class loadClass(String codebase, String name)
throws java.net.MalformedURLException, ClassNotFoundException;
public static Class loadClass(URL codebase, String name)
throws java.net.MalformedURLException, ClassNotFoundException;
}
RMI规范

注册服务程序接口


Registry接口
LocateRegistry类
RMI规范

Stub/skeleton接口
 RemoteStub类
 远程对象与stub类的类型等价性
 RemoteCall接口
 RemoteRef接口和ServerRef接口
package java.rmi.server;
public interface RemoteRef extends java.io.Externalizable {
Object invoke(Remote obj,
java.lang.reflect.Method method, Object[] params, long opnum) throws Exception;
RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash)
throws RemoteException;
void invoke(RemoteCall call) throws Exception;
void done(RemoteCall call) throws RemoteException;
String getRefClass(java.io.ObjectOutput out);
int remoteHashCode();
boolean remoteEquals(RemoteRef obj);
String remoteToString();
}
RMI规范

Stub和skeleton编译器



rmic 的 stub 和 skeleton 编译器用于为特定的远
程对象实现编译相应的 stub 和 skeleton。该编
译器将由远程对象类的类全名调用。该类必须
在先前已成功编译过。
导入类的位置由环境变量 CLASSPATH 或参数 classpath 指定。
除非指定参数 -d,否则编译好的类文件将放在
当前目录下。
互操作框架的具体内容



互操作管理设施
协议插件接口
预置互操作协议插件
PKUAS通讯框架

采用静态编译方式生成客户端stub的问题
PKUAS通讯框架

容器、公共服务和通讯机制间的关系
PKUAS通讯框架

远程框架(Remoting Framework)
PKUAS通讯框架


构件运行环境、RMI服务和通信机制之间的
耦合,使容器功能不再单一,结构错综复
杂,模块间相互耦合;
Java的RMI抽象层次太低,直接使用不利于
代码复用和控制系统复杂度。需要在RMI基
础上搭建一个系统的远程框架来有效地控
制变化性,降低系统设计的复杂性。
远端代理

预编译方式

Stub:客户端存根,远程对象的客户本地代理



负责将客户的调用转换成规定的消息包发送到服务
器端
调用Stub的方法要执行的操作
Skeleton:服务器端存根


解析接受到的调用消息调用上层构建(JDK1.2中已
不需要用)
进入方法调用时执行的操作
远端代理

动态反射方式
JDK的实现:动态代理
“变脸”与“代理”:Proxy
具有可变的构件接口
(I),能把作用在这个接
口上的方法都代理到一个
特定的调用入口
(Target(A))上

PKUAS中动态代理的实现

ProxyManagerFactory类


getClientProxyManager方法生成
ClientProxyManager
ClientProxyManager类

这是一个客户端的代理生成器类,
ProxyManager类是从容器中分离出来的,每个
容器具有对ProxyManager的引用,用它来生成
远端代理。
PKUAS中动态代理的实现
ClientProxyManager类

ClientProxyManager最关键的方法是getHomeProxy()和
getRemoteProxy(),用来生成本地和远程的代理。以
getRemoteProxy为例,beanHandler为一个客户端容器,通过
createClientContainer方法与servant关联,beanHandler与Proxy
绑定在一起,Proxy.newProxyInstance就是一个动态代理的实现:
JDK1.6:

newProxyInstance(ClassLoader loader,
Class<?>[] interfaces, InvocationHandler h)

loader - 定义代理类的类加载器

interfaces - 代理类要实现的接口列表

h - 指派方法调用的调用处理程序 ,所有作用在客户代理上的方
法调用都会代理给h,它是所有远程调用的入口。
远程通讯框架结构