Az alábbiakban bemutatjuk egy egyszerű példán keresztül a CORBA - Java
kapcsolat egy lehetséges megvalósítását. A példában CORBA IDL fordítóként a
Javasoft standard idltojava eszközét használjuk. Az egyes osztályok
implementálásánál a CORBA 3.0 által bevezetendő POA (Portable Object
Adapter) és a névszolgáltató eszközeit használjuk. Ez az elkészülő
kódot nagymértékben ORB gyártófüggetlené teszi.
Feladatunk legyen a Perzisztencia fejezetben szereplő
objektumcsoportot létrehozni úgy, hogy az egyes
Első lépésként a
A // jarmu.idl module jarmuvek { interface gepjarmu { readonly attribute string rendszam; readonly attribute string tulajdonos; string print(); }; interface autobusz : gepjarmu { attribute short ferohely; }; interface teherauto : gepjarmu { attribute short max_terheles; }; };A fenti fájlt a JavaSoft idltojava fordítóval fordítjuk le.
(Hasonló eredményt kapnánk valamely más ORB IDL fordítójával is, ma már
az összes jelentős fejlesztő a hivatalos OMG IDL/Java leképezés definíciót
veszi alapul.)
$ idltojava jarmu.idlSikeres fordítás esetén létrejönnek az alábbi generált Java forrásfájlok a jarmuvek alkönyvtár alatt:
org.omg.CORBA.Object osztályt, így
biztosítja az alapvető CORBA funkcionalitást.
narrow függvényt is,
amely segítségével konvertálhatjuk az egyes objektum referenciáinkat.
A generált Java fájlokat nem kell módosítanunk, fordítsuk le azokat, $ javac *.java |
Második lépésként létre kell hozni a szerveroldali osztályokat. Ehhez fel
fogjuk használni az előbb generált Java forrásfájlokat, de nekünk is kell
új kódot, CORBA 3.0 elnevezéssel servant-okat írnunk. Ezeket a
folyamatokat a CORBA szerver oldalán futtatjuk.
Elsőként csak a |
Végül meg kell írnunk a jarmuClient.java
kliens programot. A kliens inicializálja az ORB-t és kapcsolatot teremt
a névszolgáltatóval. Ezek után név alapján
létesít kapcsolatot a szerver oldallal és a saját címterében levő
gRef objektumot használja a távoli servant szolgáltatásainak
eléréséhez. Valójában gRef a távoli objektumok helyi képviselője,
proxy, amely a hozzá intézett hívásokat továbbítja a távoli
szolgáltató objektumokhoz és a kliens csonkon keresztül gondoskodik a paraméterek
átirányításáról a szerver felé.
|
Példaprogramunk futtatásához három terminálablakra van szükségünk.
Az elsőben elindítjuk a Java névszolgáltatót, amely a szerver és kliens
szolgáltatások név szerint történő összekapcsolását végzi, a második ablakban
a szerver folyamatot indítjuk el, a harmadik ablakban tesztelhetjük a klienst:
$ tnameserv $ java gepjarmuServer $ java jarmuClient Altalanos gepjarmu, rendszam = ABC123, tulajdonos = Valaki |
Feladatunkat most az autóbusz és a teherautó
(szerver oldali) létrehozásával folytatjuk. Kihasználjuk a
gépjármű és az autóbusz valamint teherautó
között fennálló öröklődési kapcsolatot. A CORBA az IDL szerverre képezésekor
két módszert támogat: az ImplBase alapú öröklődést és a
Tie delegációt. Az autóbusz és teherautó
létrehozásakor a Tie módszert használjuk.
Generáljuk újra az IDL-ből kapott osztályokat, de ezúttal kapcsoljuk be
a $ idltojava -ftie jarmu.idlEnnek hatására új Java forrásfájlok generálódnak: a _autobuszOperations.java, _gepjarmuOperations.java, _teherautoOperations.java. Ezek egyszerű interfészek, amelyek között már megfigyelhető az öröklődési reláció. Mivel a Java nem biztosít számunkra többszörös öröklést, ezért alkalmazzuk a delegálás módszerét. A Tie osztályok _autobuszTie.java, _gepjarmuTie.java, _teherautoTie.java. kiterjesztik a megfelelő ImplBase osztályokat, saját attributumkét pedig rendelkezésükre áll a servant egy példánya. A delegátor osztály a beérkező metódus-hívásokat átlátszóan továbbítja az "igazi" szervanthoz. |
Meg kell írnunk az autobusz és teherauto
szerveroldali reprezentáns folyamatát,
autobuszServer.java,
teherautoServer.java.
A program megvalósításánál az autobuszServlet kiterjeszti
gepjarmuServlet osztályt, (hasonlóan működik a teherautó is).
Ugyancsak módosítjuk a jarmuClient.java
kliens programot, kiegészítve a A program tesztelésénél értelemszerűen a névszolgáltatót, a három szerver folyamatot, és a klienst kell elindítani. |