RMI學習筆記

  RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.1中實現的,它大大增強了Java開發分佈式應用的能力。Java作爲一種風靡一時的網絡開發語言,其巨大的威力就體現在它強大的開發分佈式網絡應用的能力上,而RMI就是開發百分之百純Java的網絡分佈式應用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地應用於分佈式對象系統。而Java RMI 則支持存儲於不同地址空間的程序級對象之間彼此進行通信,實現遠程對象之間的無縫遠程調用。
  在一個稍微完整的系統中,會有各種各樣第三方系統或子系統,系統之間經常需要交互。大概分爲實時的和非實時的。實時的實現起來大概有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();   
        } 
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章