標籤:style blog http java 使用 2014
1. hadoop遠端程序呼叫
RPC:XML-RPC,JSON-RPC,CORBA,RMI(Remote Method Invocation),Haoop IPC(處理序間通訊)
RPC原理:允許本地程式(用戶端)調用其他機器(伺服器)上的過程,用戶端使用參數將資訊傳送給調用方,通過傳回值得到訊息。
RPC的server在運行時會阻塞在接收訊息的調用上,當接到用戶端的請求後,會解包以擷取請求參數;結束後傳回值通過主程式打包發送給用戶端。
1.1. java RMI
依賴於java序列化機制
運行一個jvm裡的java程式調用另一個jvm裡的程式,用戶端保留一個調用對象的介面,通過介面方式調用方法。而介面實際執行是在服務端,服務端才具有調用對象的執行個體,用戶端可以簡單理解為僅是一個代理。
遠程對象,實現了一個或多個遠程介面,遠程介面聲明了可以由外部系統調用的對象方法。(遠程只是一個修飾語)
1、 定義一個遠程介面(實驗是失敗的)
實際代碼:
package test.rmi;import java.io.Serializable;import java.rmi.Remote;import java.rmi.RemoteException;//必須繼承Remote介面//必須實現Serializable,增加序列化功能public interface RMIQueryStatus extends Remote,Serializable{//方法必須拋出RemoteException異常String getFileName(String fileName) throws RemoteException;}2、定義一個遠程對象的實作類別package test.rmi;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus{//聲明一個版本ID(必須要有嗎?可以試試)private static final long serialVersionUID = 1L;public RMIQueryStatusImpl() throws RemoteException {super();// TODO Auto-generated constructor stub}@Overridepublic String getFileName(String fileName) throws RemoteException {// TODO Auto-generated method stubreturn fileName+" ,good,you get it!";}}3、開啟JAVA RMI註冊服務在cmd下運行rmiregistry (使用預設連接埠12090)可以增加 如rmiregistry 10000,即使用10000連接埠5、編寫服務端主程式package test.rmi;import java.rmi.Naming;import java.rmi.registry.LocateRegistry;public class RMIQueryStatusServer {public static void main(String[] args) throws Exception {//建立遠程對象執行個體RMIQueryStatusImpl rmiObj = new RMIQueryStatusImpl();//使用本地連接埠,12090LocateRegistry.createRegistry(12090);//綁定遠程對象到名字Naming.rebind("RMI_URL", rmiObj);System.out.println("Server is ready.");}}
運行報錯(解決不了):
java.lang.ClassNotFoundException: test.rmi.RMIQueryStatus
5、用戶端程式:
package test.rmi;import java.rmi.Naming;public class RMIQueryStatusClient {public static void main(String[] args) throws Exception{//從註冊點擷取一個遠程對象RMIQueryStatus remoteObj = (RMIQueryStatus) Naming.lookup("RMI_URL");//調用方法String res = remoteObj.getFileName("hello");//輸出結果System.out.println(res);}}
--不知道書中是如何成功的。有時間將這個問題解決一下