rmi在jdk1.5之前使用是非常复杂的,需要做6个步骤:1.定义和实现远端接口中的参数。2.定义和实现远程接口。3.编写服务端代码。4.编写客户端代码。5.生成stub和skeltion,并将stub打包到客户端jar中,将skeltion打包到服务端jar中。6.启动rmiregistry,并将服务注册到rmiregistry中,然后运行代码。还需要执行一些命令行程序,非常复杂。
在jdk1.5中,使用了动态代理技术,实现了动态生成stub和skeltion类,从而省去了相当多的繁琐工作,rmi的创建和发布已经变得非常简单。
只需以下四个步骤:
第一、创建接口,必须继承Remote接口
import java.rmi.*; /** * 远程接口必须扩展接口java.rmi.Remote */ public interface HelloInterface extends Remote { /** * 远程接口方法必须抛出 java.rmi.RemoteException */ public String say() throws RemoteException; }
第二、创建业务类,此类必须实现上面定义的接口和实现UnicastRemoteObject接口
import java.rmi.*; import java.rmi.server.*; /** * 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface */ public class Hello extends UnicastRemoteObject implements HelloInterface { private String message; /** * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常 */ public Hello(String msg) throws RemoteException { message = msg; } /** * 远程接口方法的实现 */ public String say() throws RemoteException { System.out.println("Called by HelloClient"); return message; } }
第三、服务端将需要发布出去的服务使用rmi进行注册,以便客户端可以查找到相应服务。
import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class HelloServer { /** * 启动 RMI 注册服务并进行对象注册 */ public static void main(String[] argv) { try { //启动RMI注册服务,指定端口为1099 (1099为默认端口) //也可以通过命令 $java_home/bin/rmiregistry 1099启动 //这里用这种方式避免了再打开一个DOS窗口 //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用 LocateRegistry.createRegistry(1099); //创建远程对象的一个或多个实例,下面是hello对象 //可以用不同名字注册不同的实例 HelloInterface hello = new Hello("Hello, world!"); //把hello注册到RMI注册服务器上,命名为Hello //Naming.rebind("Hello", hello); //如果要把hello实例注册到另一台启动了RMI注册服务的机器上 Naming.rebind("//192.168.61.113:1099/Hello",hello); System.out.println("Hello Server is ready."); } catch (Exception e) { System.out.println("Hello Server failed: " + e); } } }
第四、客户端通过java.rmi.Naming进行查找自己需要的服务,查找到之后就可以像使用本地对象一样使用远程对象。
import java.rmi.Naming; public class HelloClient { /** * 查找远程对象并调用远程方法 */ public static void main(String[] argv) { try { //HelloInterface hello = (HelloInterface) Naming.lookup("Hello"); //如果要从另一台启动了RMI注册服务的机器上查找hello实例 HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.61.113:1099/Hello"); //调用远程方法 System.out.println(hello.say()); } catch (Exception e) { System.out.println("HelloClient exception: " + e); } } }
现在的rmi就是这么简单,而rmi是一切远程调用的核心,ejb也只不过是对rmi进行了包装而已。通过以上步骤,您就可以发布属于自己的rmi系统。