Broker - Exemplul RMI

Se considera aplicatia StockMarket, care ofera clientilor posibilitatea de a afla pretul curent al actiunilor companiilor cotate la bursa.

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.

Codul sursa al aplicatiei StockMarket

Aplicatia este formata din urmatoarele 4 clase care trebuie scrise de catre programator: StockMarket.java, StockMarketImpl.java, StockMarketServer.java si StockMarketClient.java.

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

Build-uirea, deployment-ul si rularea aplicatiei StockMarket

Incepeti prin a downloada cele 4 fisiere de cod sursa: StockMarket.java, StockMarketImpl.java, StockMarketServer.java si StockMarketClient.java.

Compilati cele 4 fisiere.

In continuare sunt posibile 3 variante pentru build-uirea si deploymentul aplicatiei:

  1. Varianta 1: cu stub si skeleton generate static
  2. Varianta 2: doar cu stub generat static
  3. varianta 3: cu stub generat dinamic

Varianta 1 - cu generarea statica a stub si skeleton

Pasii de urmat sunt:
  1. Se porneste de la codul sursa scris de programatorul aplicatiei Stockmarket: StockMarket.java, StockMarketImpl.java, StockMarketServer.java, StockMarketClient.java
  2. Compilare cod sursa:
     javac *.java
  3. Generare proxy-uri: cu comanda:
     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.

  4. Deployment Server: Pentru server aveti nevoie de urmatoarele clase: StockMarket.class, StockMarketImpl.class, StockMarketImpl_Skel.class, StockMarketServer.class
  5. Deployment Client: Pentru client aveti nevoie de urmatoarele clase: StockMarket.class, StockMarketImpl_Stub.class, StockMarketClient.class
  6. Porniti Naming Service (rmiregistry):
     start rmiregistry 
  7. Porniti Serverul:
     start java StockMarketServer 
  8. Porniti Clientul:
     java StockMarketClient 

Varianta 2 - cu generarea statica a stub-ului

Se inlocuieste Pasul 3 de mai sus de Generare proxy-uri: cu noua varianta de comanda:
 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.

Varianta 3 - cu generarea dinamica a stub-ului

Se sare complet Pasul 3 de mai sus de Generare proxy-uri, nu se mai executa de loc comanda rmic.

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.