RMI-远程方法调用
RMI支持存储于不同地址空间(不同Jvm)的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。提供服务的一端被称为服务端,使用服务的为客户端。
实现RMI的一个前提是 服务端和客户端实现同一个接口,此接口必须满足以下两点:
- 继承自 java.rmi.Remote
接口内的每个方法声明抛出 throws RemoteException
一个最简单的RMI例子:服务器会提供一个WorldClock服务,允许客户端获取指定时区的时间
public interface WorldClock extends Remote { LocalDateTime getLocalDateTime(String zoneId) throws RemoteException; }
服务端分为两部分,一部分是服务的实现,一部分是将服务以RMI的形式暴露在网络上
- 服务的实现
public class WorldClockService implements WorldClock{ @Override public LocalDateTime getLocalDateTime(String zoneId) throws RemoteException { return LocalDateTime.now(ZoneId.of(zoneId)).withNano(0); } }
- 将服务以RMI的形式暴露在网络上
public class Server{ public static void main(String[] args) throws RemoteException { WorldClock worldClock = new WorldClockService(); WorldClock skeleton = (WorldClock)UnicastRemoteObject.exportObject(worldClock, 0); Registry registry = LocateRegistry.createRegistry(1009); registry.rebind(WorldClock.class.getSimpleName(), skeleton); } }
客户端调用服务
public class Client{ public static void main(String[] args) throws RemoteException, NotBoundException { Registry registry = LocateRegistry.getRegistry("localhost", 1009); WorldClock worldClock = (WorldClock) registry.lookup(WorldClock.class.getSimpleName()); LocalDateTime now = worldClock.getLocalDateTime("Asia/Shanghai"); System.out.println(now); } }