Thursday, October 6, 2011

Contoh Penggunaan Java RMI

Java RMI(Remote Method Invocation) merupakan fitur dari J2SE yang memungkinkan kita untuk mengakses dan mengendalikan object yang berada pada host yang berbeda atau dengan kata lain, kita mengakses  object yang berada pada Java Virtual Machine(JVM) yang berbeda. Hal ini berarti kita bisa memanggil method yang terdapat pada object tersebut.
Bagian ini akan membahas mengenai contoh sederhana Java RMI sehingga memudahkan pembaca dalam memahami konsep RMI.
Sebagai bentuk pemrograman tersebar, setidaknya ada beberapa bagian dari RMI yang harus ada:
1.    Interface yang berisi method yang bisa dipanggil.
2.    Object yang akan di-share, yang mengimplementasikan Interface di atas.
3.    Aplikasi server yang akan meng-share dan memberi ‘nama’ object tersebut ke registry.
4.    File stub yang akan degenerate dari object yang di-share tersebut.
5.    Client yang akan mengambil object yang di-share di registry dengan berdasarkan ‘nama’ yang dimiliki object tersebut dan memanggil method yang dimiliki oleh object tersebut.
Sesuai dengan beberapa file di atas, maka kita harus membuat file tersebut satu persatu.
1.    Interface yang berisi method yang bisa dipanggil.
Pertama, kita harus membuat interface yang berisi method yang nantinya akan dipanggil.

// OperasiNilai.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface OperasiNilai extends Remote{
    public int ambilNilai() throws RemoteException;
    public int tambahNilai(int nilaiTambah) throws RemoteException;
    public String ambilNama() throws  RemoteException;
  }
Interface yang akan dibuat, harus meng-induk pada interface Remote. Selain itu setiap method yang dibuat, harus melempar(throws) exception berupa RemoteException.
Langsung compile Interface ini dengan perintah pada command prompt/shell:
javac OperasiNilai.java







2.Membuat Object yang akan di-share, yang mengimplementasikan Interface di atas.
Berikutnya adalah mengimplementasikan Interface di atas pada object yang akan di-share.


// NilaiImpl.java
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class NilaiImpl extends UnicastRemoteObject implements OperasiNilai 
{
    public NilaiImpl() throws RemoteException{
        super();
    }
    public int ambilNilai() throws RemoteException {
        return 80;
            }
    public int tambahNilai(int nilaiTambah) throws RemoteException {
        return nilaiTambah+60;
    }
  public String ambilNama() throws RemoteException {
        return "nama mahasiswa";
    }
  }
Object tersebut harus menginduk pada UnicastRemoteObject dan mengimplementasikan Interface sebelumnya (OperasiNilai) .  setiap method dalam interface bisa dideklarasikan sesuai keperluan. Selain itu, class tersebut harus mempunyai Constructor yang melempar(throws) RemoteException dan memanggil constructor induk.
Langsung compile Class ini dengan perintah pada command prompt/shell:
javac NilaiImpl.java

3.    Membuat Aplikasi server yang akan meng-share dan memberi ‘nama’ object tersebut ke registry.
Selanjutnya adalah membuat server yang menginisiasi object yang akan di-share dan mendaftarkan object tersebut ke registry.
//NilaiServer.java
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class NilaiServer {
    public static void main(String[] args){
        try {
            NilaiImpl objectNilai=new NilaiImpl();          
             Naming.rebind("object1", objectNilai);
            } catch (RemoteException ex) {
            Logger.getLogger(NilaiServer.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
                Logger.getLogger(NilaiServer.class.getName()).log(Level.SEVERE, null, ex);
            }
    }
}

Pada contoh di atas, object NilaiImpl diinisialisasi dan diberi nama objectNilai. objectNilai tersebut didaftarkan pada rmiregistry dengan nama “object1” dengan menggunakan Naming.rebind(). Selain itu kedua hal di atas harus di-catch exceptionnya.

   NilaiImpl objectNilai=new NilaiImpl();      //inisialisasi object    
             Naming.rebind("object1", objectNilai); //penamaan object dengan nama “object1”



Dengan ini, kebutuhan untuk server sudah hampir terpenuhi. Selanjutnya kita harus mengcompile file-file di atas. Misalkan file di atas terletak pada folder “server” di direktori computer anda maka gunakan perintah pada command prompt atau pada shell:
Langsung compile Interface ini dengan perintah pada command prompt/shell:
javac NilaiServer.java

 sehingga pada folder tersebut terdapat 6 buah file, yaitu 3 file java di atas dan 3 file class hasil compile.
OperasiNilai.java          OperasiNilai.class
NilaiImpl.java            NilaiImpl.class
NilaiServer.java                   NilaiServer.class

4.    Membuat File stub yang akan degenerate dari object yang di-share tersebut.
Untuk membuat file stub, cukup kita menggenerate stub dari class NilaiImpl.class atau class dari object yang akan dishare.
rmic  NilaiImpl
sehingga kita akan mendapatkan satu file tambahan yaitu NilaiImpl_stub.class . file ini akan kita ambil dan diletakkan di client.


5.    Client yang akan mengambil object yang di-share di registry dengan berdasarkan ‘nama’ yang dimiliki object tersebut dan memanggil method yang dimiliki oleh object tersebut.
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class NilaiClient {
   public static void main(String args[]){
try {
            String url= "rmi://127.0.0.1/object1";
            Object o1=Naming.lookup(url);
            OperasiNilai objNilai=(OperasiNilai) o1;
            System.out.println("ambil Nama: "+objNilai.ambilNama());
            System.out.println("ambil Nilai: "+objNilai.ambilNilai());
            System.out.println("tambah Nilai: "+objNilai.tambahNilai(40));
        } catch (NotBoundException ex) {
            Logger.getLogger(NilaiClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(NilaiClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(NilaiClient.class.getName()).log(Level.SEVERE, null, ex);
        }     
   }
Pada bagian client ini kita membutuhkan file interface OperasiNilai.class hasil compile pada bagian sebelumnya.  Class tersebut letakkan pada folder client bersama dengan file NilaiClient.java sebelum dicompile.
pada bagian client ini juga, object di ambil dari registry melalui nama yang diberikan dan memanggil method yang ada pada object tersebut.

            String url= "rmi://127.0.0.1/object1";
// dari url berupa ip address atau nama host dari object, dilanjutkan dengan nama object.
            Object o1=Naming.lookup(url);
//ambil object dari registry dengan menggunakan Naming.lookup
            OperasiNilai objNilai=(OperasiNilai) o1;
//overcast object dengan Interface yang didesain di awal
            System.out.println("ambil Nama: "+objNilai.ambilNama());
//panggil method yang terdapat pada object tersebut.
            System.out.println("ambil Nilai: "+objNilai.ambilNilai());
            System.out.println("tambah Nilai: "+objNilai.tambahNilai(40));

Setelah itu compile file tersebut:
javac  NilaiClient.java
ditambah dengan stub pada langkah 4, maka pada folder client terdapat file-file berikut:
NilaiClient.java    NilaiClient.class
NilaiImpl_stub.class    OperasiNilai.class


Dengan begitu kita bisa menjalankan baik server maupun client.
Pertama, kita jalankan terlebih dahulu rmiregistry dengan perintah berikut.
start rmiregistry





Sehingga muncul jendela baru…

 
Jalankan server… dengan perintah berikut:
java NilaiServer



Langkah terakhir, kita panggil method dari client…
java NilaiClient
 



Dengan begitu kita telah memanggil object dari server, dan menggunakan beberapa method yang dimiliki object tersebut.


No comments:

Post a Comment