Remote Method Invocation (RMI)

  โดย นายนพ

 
  เกริ่นนำ
RMI เป็นเทคโนโลยีที่ช่วยนักพัฒนาในการเขียน Distributed Object Computing.  ถ้าให้พูดกันง่ายๆ RMI ช่วยให้เราสามารถเรียกใช้ Remote Object จากหลายๆ JVM โดยผ่าน LAN, WAN, หรือ WWW. RMI ถือว่าค่อนข้างง่ายเมื่อเทียบกันเทคโนโลยีอื่นๆ ที่ใช้เกียวกับ Distrubted Computing. ตัวย่างที่เห็นใช้ RMI ก็คือ  Banking Online หรือ RealTime Stock Quote.

เริ่มกันเลย
RMI ประกอบด้วย 5 ขั้นตอน
1. Interface ของ Remote Object.
2. Implementation ของ Remote Object.
3. Host  Server
4. Client Application
5. สร้าง stub และ skeleton

เราจะมาเริ่มเขียน RMI ให้ส่งข้อความสั้น "Hello"  ทุกครั้งที่มีการ Request จาก Client.
1. ขั้นตอนแรก  เขียน Interface ของ Remote Object. (Hello.java)
public interface Hello extends java.rmi.Remote {
  public String Hello() throws java.rmi.RemoteException;
}

2. เมื่อเราได้ Interface ของ Object แล้ว เราก็มาเขียน implementation ของ object. (HelloImpl.java)
public class HelloImpl extends java.rmi.server.UnicastRemoteObject implements Hello {
  public HelloImpl() throws java.rmi.RemoteException {
    super();
  }

  public String Hello() throws java.rmi.RemoteException {
    System.out.println("returned \"Hello\" to the client.");
    return "Hello";
  }
}

3. เขียน service สำหรับ run  บน host. (HelloServer.java)
import java.rmi.Naming;

public class HelloServer {
  public HelloServer() {
    try {
      Hello h = new HelloImpl();
      Naming.rebind("rmi://localhost:1099/HelloServer", h);
      System.out.println("Waiting for clients...");
    }
    catch (Exception e) {
      System.out.println("Trouble: " + e);
    }
  }

  public static void main(String args[]) {
    new HelloServer();
  }
}

4. เขียนโปรแกรมที่เรียกใช้ Service ในขั้นที่ 3 (HelloClient.java)
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class HelloClient {

   public static void main(String[] args) {
     try {
       Hello h = (Hello) Naming.lookup("rmi://localhost/HelloServer");
       System.out.println( h.Hello() );
     }
     catch (MalformedURLException murle) {
       System.out.println();
       System.out.println("MalformedURLException");
       System.out.println(murle);
     }
     catch (RemoteException re) {
       System.out.println();
       System.out.println("RemoteException");
       System.out.println(re);
     }
     catch (NotBoundException nbe) {
       System.out.println();
       System.out.println("NotBoundException");
       System.out.println(nbe);
     }
     catch (java.lang.ArithmeticException ae) {
       System.out.println();
       System.out.println("java.lang.ArithmeticException");
       System.out.println(ae);
     }
  }
}

5. ไปที่ commandline บน dos  เพี่อที่จะสร้าง stub และ skeleton (จะพูดถึงรายละเอียดของ protocal และ architecture ของ rmi ในตอนที่ 2)
c:\rmic HelloImpl
*  rmic.exe จะอยู่ที่ bin ไดเรคทรอรี่ของ JDK, ให้ทำการเซ็ต path ไปที่ไดเรคทรอรี่นี้
เมื่อเราสร้าง stub กับ skeleton ของ  HelloImpl เราจะได้ไฟล์ใน directory เดียวกันเพิ่มมาสองไฟล์คือ HelloImpl_Stub.class และ HelloImpl_Skel.class

ถึงตรงนี้แล้วเราก็ได้ service ที่จะรันบน host และโปรแกรมที่เรียกใช้ service ดังกล่าว เราก็มารัน rmi กันเลย
1. ก่อนอื่นเราต้องเรียก RMI registry โดยการพิมพ์ c:\rmiregistry บน commandline
2. เปิดหน้าต่างใหม่ของ dos แล้วก็รัน c:\java HelloServer เพื่อรัน service
3. เปิดหน้าต่างของ dos ขึ้นมาอีกหนึ่งหน้าต่าง แล้วพิมพ์ c:\java HelloClient
4. เราก็จะได้ คำกล่าวสวัสดีว่า "Hello"
Note: อย่าลืมทำการ complie โปรแกรม HelloServer.java และ HelloClient.java ก่อนที่จะรัน

จากตัวอย่างข้างต้น ก็คิดว่าผู้อ่านก็จะได้เห็นภาพว่า rmi ทำงานอย่างไร มีขั้นตอนการสร้างอย่างไร เราจะมาพูดกันถึง structure ของ rmi และการใช้ rmi ร่วมกับ JDBC, หรือ servlet ในบทความหน้า