在一個稍微完整的系統中,會有各種各樣第三方系統或子系統,系統之間經常需要交互。大概分爲實時的和非實時的。實時的實現起來大概有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();
}
}
}