Acest exemplu simplu este folosit in scopul ilustrarii modului de utilizare a unei infrastructuri de tip broker (in acest caz RMI) pentru distributed object computing.
Se vor urmari:
Observarea acestor aspecte poate facilita abordarea temei ToyORB.
Interfata serverului este StockMarket:
public interface StockMarket extends java.rmi.Remote { float get_price (String Company) throws RemoteException; }
O implementare simplista a serverului este StockMarketImpl, care returneaza o valoare oarecare indiferent de numele companiei (o implementare mai realista ar consulta o baza de date).
public class StockMarketImpl extends UnicastRemoteObject implements StockMarket { public StockMarketImpl() throws RemoteException {} public float get_price(String company) { float price=12345; System.out.println("get_price method executing"); return price; } }
Programul server StockMarketServer creaza un obiect StockMarketImpl si il inregistreaza la broker sub numele de "Nasdaq".
public class StockMarketServer { public static void main(String[] args) { System.out.println("StockMarketServer main started"); try { StockMarketImpl stockMarketImpl = new StockMarketImpl(); Naming.rebind("NASDAQ", stockMarketImpl ); System.out.println("StockMarketServer main registered NASDAQ object"); } catch (Exception e) {} } }Programul client StockmarketClient ii cere brokerului sa ii dea o referinta la obiectul la distanta "Nasdaq", care e un server de tip StockMarket. Va obtine referinta (de fapt un proxy) pe care poate invoca metodele din interfata serverului.
public class StockMarketClient { public static void main(String[] args) { try { StockMarket market= (StockMarket) Naming.lookup("rmi://localhost/NASDAQ"); float price=market.get_price("ABC SRL"); System.out.println("Price is "+price); } catch (Exception e) { System.out.println("Exception !"); } } }
Compilati cele 4 fisiere.
In continuare sunt posibile 3 variante pentru build-uirea si deploymentul aplicatiei:
javac *.java
rmic -v1.1 StockMarketImpl
Se obtin StockMarketImpl_Stub.class si StockMarketImpl_Skel.class
Daca doriti sa vedeti si codul sursa corespunzator acestor clase, se poate folosi optiunea -keep
rmic -v1.1 -keep StockMarketImpl
Se obtin StockMarketImpl_Stub.java si StockMarketImpl_Skel.java care pot fi interesante de examinat.
start rmiregistry
start java StockMarketServer
java StockMarketClient
rmic StockMarketImpl
Se obtine doar StockMarketImpl_Stub.class (nu se mai obtine si StockMarketImpl_Skel.class)
Pentru skelleton, nu se mai genereaza o clasa dependenta de aplicatie, ci se foloseste un skeleton general care lucreaza folosind facilitatea de Reflection in Java.
Se continua similar cu pasii de la varianta 1.
Se continua similar cu pasii de la varianta 1, pana la pasul 8, de pornire a clientului. Lansarea in executie a clientului se va face specificand valoarea unei proprietati:
java -Djava.rmi.server.ignoreStubClasses=true StockMarketClient
In acest caz, clasa pentru stub va fi generata dinamic la runtime atunci cand va fi nevoie de ea, in mod total transparent pentru dezvoltatorul aplicatiei, prin mecanismul de Dynamic Proxy.