RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
在一个稍微完整的系统中,会有各种各样第三方系统或子系统,系统之间经常需要交互。大概分为实时的和非实时的。实时的实现起来大概有webservice,http,rmi等,非实时的大概有ftp/sftp上传下载文件,通过扫描数据库表等。总的来说,在不同的jvm间进行简单的交互,没必要使用webservice,显得过于臃肿。下面就记录下学习RMI的一个简单例子。
IHello.java
HelloClient.java
在一个稍微完整的系统中,会有各种各样第三方系统或子系统,系统之间经常需要交互。大概分为实时的和非实时的。实时的实现起来大概有webservice,http,rmi等,非实时的大概有ftp/sftp上传下载文件,通过扫描数据库表等。总的来说,在不同的jvm间进行简单的交互,没必要使用webservice,显得过于臃肿。下面就记录下学习RMI的一个简单例子。
配置文件rmi.conf。方便对rmi进行修改。
url=rmi://127.0.0.1:8889/RHello
interface=com.mclaren.network.rmi.IHello
implementClz=com.mclaren.network.rmi.HelloImpl
IHello.java
package com.mclaren.network.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*
* @ClassName: IHello
* @Description: TODO
* @author Mclaren Pan
* @date 2014-10-8 下午11:11:47
*
*/
public interface IHello extends Remote {
public String helloWorld() throws RemoteException;
public String sayHelloToSomeBody(String someBody) throws RemoteException;
}
HelloImpl.java
package com.mclaren.network.rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
*
* @ClassName: HelloImpl
* @Description: TODO
* @author Mclaren Pan
* @date 2014-10-8 下午11:11:40
*
*/
public class HelloImpl extends UnicastRemoteObject implements IHello {
public HelloImpl() throws RemoteException {
}
public String helloWorld() throws RemoteException {
// TODO Auto-generated method stub
return "Hello World!";
}
public String sayHelloToSomeBody(String someBody) throws RemoteException {
// TODO Auto-generated method stub
return "你好, " + someBody + "!";
}
}
HelloServer.java 服务端进行配置化,从rmi.conf读rmi的url和实现类,通过反射注册。
package com.mclaren.network.rmi;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Properties;
/**
* @ClassName: HelloServer2
* @Description: TODO
* @author Mclaren Pan
* @date 2014-10-8 下午1:29:33
*
*/
public class HelloServer {
private static final String reg = ".*:(\\d+).*";
private String url;
private String port;
private String implClz;
public static void main(String[] args) {
HelloServer server = new HelloServer();
server.register();
}
private void initRmiConf() {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("rmi.conf");
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
url = prop.getProperty("url");
port = url.replaceAll(reg, "$1");
implClz = prop.getProperty("implementClz");
}
public void register() {
initRmiConf();
try {
Object implClzObj = Class.forName(implClz).newInstance();
LocateRegistry.createRegistry(Integer.valueOf(port));
Naming.bind(url, (Remote) implClzObj);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AlreadyBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
HelloClient.java
package com.mclaren.network.rmi;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/**
*
* @ClassName: HelloClient
* @Description: TODO
* @author Mclaren Pan
* @date 2014-10-8 下午11:11:05
*
*/
public class HelloClient {
public static void main(String[] args) {
try {
IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8889/RHello");
System.out.println(rhello.helloWorld());
System.out.println(rhello.sayHelloToSomeBody("jerry"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}