RMI
Java的远程程序调用(Remote Method Invocation,RMI)技术
对方法的直接调用,要求两个对象都在同一个堆上
远程过程调用的设计
需要创建出4个东西:客户端、客户端辅助设施、服务端、服务端辅助设施
客户端从客户端辅助设施中获取服务,就好像在本机调用服务一样,但事实上客户端辅助设施只是服务的代理,它将服务器辅助设施打包好传来的服务进行处理,再交给客户端。
-
调用方法的过程
客户端对象向辅助设施对象调用doBigThing();
辅助设施对象将调用信息打包发给服务器的辅助设施对象;
服务器的辅助设施对象打开调用信息,并以此调用真正的服务。
使用RMI时,必要决定协议,有两种:JRMP 和 IIOP
JRMP是RMI的原生协议,支持Java与Java之间的远程调用;
IIOP是为了CORBA(Common Object Request Broker Architecture)产生的,支持Java与其他类型的远程方法。
创建远程服务的步骤
//step 1 创建远程接口
/*继承java.rmi.Remote;
import java.rmi.*;
public interface MyRemote extends Remote {
//声明所有方法都会抛出RemoteException
//远程方法的确定参数和返回类型都是primitive主要数据类型或Serializable
public String sayHello() throws RemoteException;
}
//step 2 实现远程接口
//继承UnicastRemoteObject 获得远程相关功能;UnicastRemoteObject 的构造函数会抛出
//RemoteException 异常,因此继承它的子类,其构造函数也会抛出异常
public class MyRomoteImpl extends UnicastRemoteObject implements MyRomote {
public String sayHello() {
return "Server says, 'Hey'";
}
public MyRemoteImpl() throws RemoteException {};
public static void main(String[] args) {
//向 RMI registry 注册服务
try {
MyRemote service=new MyRemoteImpl();
Naming.rebing("Remote Hello", service);
} catch(Exception ex) {...}
}
}
//客户端程序代码
import java.rmi.*; // Naming类在此
public class MyRemoteClient {
public static void main(String[] args) {
new MyRemoteClient().go();
}
public void go() {
try {
MyRemote service=(MyRemote) Naming.lookup("rmi://127.0.0.1/Remote Hello");
String s=service.sayHello();
System.out.println(s);
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
Servlet
servlet是Web服务器上的Java程序,它不是Java的标准函数库的一部分,需要另行添加
相关内容有Enterprise JavaBeans(EJB),Jini
Jini具有:
-
adaptive discovery (自适应探索)
Jini查询服务要求网络上的服务注册,并发送序列化对象给查询服务
-
self-healing network (自恢复网络)
当某个Jini服务要求注册,查询服务会返回一份租约,新注册的服务需要定期更新服务否则查询服务会认为该服务离线