You are on page 1of 18

Java RMI (Remote Method Invocation)

RMI je Java tehnologija za pisanje distribuiranih aplikacija.

Komunikacija izmeu klijenta i servera omoguena je preko interfejsa. Protokol koji se koristi za komunikaciju zove se JRMP (Java Remote Method Protocol) . Dve automatski generisane klase implementiraju ovaj protokol:
Stub klasa na klijentu Skeleton klasa na serveru

Client object

RMI interface JVM 1

Client stub

Server skeleton JVM 2

RMI object

RMI komunikacija
Java RMI omoguava poziv metoda objekata koji su vezani za razliite Java virtuelne maine (JVM). Java virtuelne maine mogu biti na razliitim raunarima, ili na jednom raunaru. U oba sluaja metod objekta se izvrava u drugom adresnom prostoru u odnosu na program klijent. Klijent je program koji poziva metod udaljenog objekta, a server sadri taj objekat. Tri entiteta su ukljuena u izvrenje programa koji koristi RMI: Klijent koji poziva metod udaljenog objekta Server koji sadri udaljeni objekat Registar objekata (rmiregistry) koji povezuje objekte sa imenima, tj. u kome se registruju objekti

RMI komunikacija

Rmiregistry se izvrava na poznatom portu (1099-po defaultu) . Server po startovanju registruje svoje objekte u registru objekata preko simbolikog imena Klijent pre poziva metoda mora prvo da kontaktira registar objekata da bi dobio pristup udaljenom objektu Podrku u ovoj komunikaciji pruaju
Stub class koja slui za odgovarajue marshal-ovanje parametara i slanje poruke preko mree, kao i za primanje poruke i unmarshalovanje rezultata Skeleton class prima poruku i unamarshal-uje parametre i prosleuje ih server objektu koji izvrava metod i vraa rezultat skeletonu koji ga marshal-uje i alje poruku preko mree.

Arhitektura RMI sistema


Definicija interfejsa za udeljene servise (metode)remote interfejs Implementacija udaljenih servisa (metoda)-remote class Stub i skeleton fajlovi Server koji obezbeuje udaljene servise RMI naming servisi koji omoguavaju klijentu da nae udaljene sevise Provajder class fajlova ( HTTP ili FTP server) Klijent program koji poziva udaljene servise

Koraci za kreiranje RMI sistema


Pisanje Java koda za interfejse Pisanje Java koda za klase koje implementiraju interfejse Generisanje Stub i Skeleton class fajlova iz klasa koje implementiraju interfejse (SAMO ZA VERZIJE KOJE PRETHODE JAVA 1.5!!!, INAE NE TREBA) Pisanje Java koda programa koji opsluuje udaljene servise (host server) Pisanje Java koda za klijent program

1.Kreiranje Remote Interfejsa


Remote interfejs mora da nasleuje java.RMI.Remote. Svaki metod u interfejsu se deklarie tako da moe da emituje (throws) RemoteException
Calculator.java public interface Calculator

public long add(long a, long b) }

extends java.rmi.Remote {

throws java.rmi.RemoteException;

2.Implementacija Remote interfejsa


Remote klasa koja implementira Remote interfejs, treba da nasleuje java.rmi.server.UnicastRemoteObject klasu da bi se povezala na RMI sistem. Objekti ove klase postoje u adresnom prostoru servera i mogu se pozivati udaljeno. Ako ovi objekti imaju metode kojih nema u interfejsu oni se mogu pozivati lokalno Poziv udaljenog metoda moe da bude neuspean pa svaki metod ove klase mora da u deklaraciji ima throws java.rmi.RemoteException;
CalculatorImpl.java public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator { public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; }

3. Stub i skeleton
U starim verzijama Jave, RMI kompajler (rmic) se koristio za generisanje stuba i skeletona. U verziji 1.5, ove klase se generiu dinamiki i rmic se ne koristi.

4. Host server
U okviru ovog programa obavlja se kreiranje i registrovanje remote objekta u registru objekata (rmiregistry) koji se nalazi na lokalnom hostu i slua na portu 1099. Registrovanje se obavlja pozivom metoda klase java.rmi.Naming:
Naming.rebind(object_name, object) gde je object_name String koji imenuje udaljeni objekat, a object je udaljeni objekat koji se registruje

CalculatorServer.java

import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); }

Naming.rebind("rmi://localhost:1099/CalculatorService", c);

5.Klijent
Klijent je program koji poziva udaljeni metod. Da bi to uradio klijent koristi referencu na udaljeni objekat (object handle). Za to je potrebno znati: 1.Adresu maine na kojoj se izvrava rmiregistry u kome se registruje udaljeni objekat 2. Port na kome se rmiregistry izvrava (ako je 1099 moe se izostaviti) 3. Ime objekta u rmiregistry-ju Klijent u u ovu svrhu koristi lookup metod klase java.rmi.Naming. Povratna vrednost iz ovog metoda mora biti cast-ovana u tip remote interfejs
CalculatorClient.java Calculator c = (Calculator) Naming.lookup( "rmi://localhost /CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) );

Calculator-kod
public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException;

public long div(long a, long b) throws java.rmi.RemoteException; }

import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { public CalculatorImpl() throws RemoteException{ super(); } public long add(long a, long b) throws RemoteException { } return a + b;

public long sub(long a, long b) throws RemoteException { } return a - b;

public long mul(long a, long b) throws RemoteException { }

return a * b;

public long div(long a, long b) throws RemoteException {

return a / b;

import java.io.IOException; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; public class CalculatorServer { public CalculatorServer(String host, String port, String service) { try {

} catch (MalformedURLException malformedException) { System.err.println( "Failure during Name registration: " + malformedException); }

} catch (RemoteException remoteException) { System.err.println( "Failure during object export to RMI: " + remoteException);

Calculator c = new CalculatorImpl(); Naming.rebind("rmi://" + host + ":" + port + "/" + service, c);

public static void main(String[] args) {


String host = args[0]; String port = args[1]; String service = args[2]; new CalculatorServer(host, port, service); System.out.println("Server started."); System.out.println("Enter <CR> to end."); try { System.in.read(); } catch (IOException ioException) { } System.exit(0);

} }

import import import import import

java.rmi.Naming; java.rmi.RemoteException; java.net.MalformedURLException; java.rmi.NotBoundException; java.rmi.*;

public class CalculatorClient {

public static void main(String[] args) {


String host = args[0]; String port = args[1]; String service = args[2];

try { Calculator c = (Calculator) Naming.lookup("rmi://" + host + ":" + port + "/" + service); System.out.println( System.out.println( System.out.println( System.out.println( c.sub(4, 3) ); c.add(4, 5) ); c.mul(3, 6) ); c.div(9, 3) );

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); } } }

Tipovi klasa u RMI


Remote klasa- instance ove klase se mogu koristiti ili lokalno ili udaljeno. U potonjem sluaju ovoj klasi se pristupa preko reference na objekat (object handle). CalculatorImpl je primer remote klase. Serializable klasa (implementira Serializable interfejs koji nema metode) ije instance se mogu kopirati iz jednog adresnog prostora u drugi, kao to je prikazano na slici

serijalizacija

object

serialization

byte stream

byte stream

deserialization object copy JVM 2

JVM 1

Prenos parametara
Ako se serializable objekat prosledjuje kao parametar (ili povratna vrednost) poziva udaljenog metoda, onda se vrednost objekta prenosi iz jednog adresnog prostora u drugi. Podaci primitivnih tipova i lokalni objekti se prenose kao serializable. Ako se objekat remote klase prosledjuje kao parametar (ili povratna vrednost) onda se referenca na objekat (object handle) prenosi iz jednog iz jednog adresnog prostora u drugi U primeru Calculator prenose se podaci primitivnih tipova, tj. po vrednosti

You might also like