Programovanie

RMI cez IIOP

Čo je RMI cez IIOP?

RMI over IIOP (ďalej RMI-IIOP), vyvinuté spoločne spoločnosťami IBM a Sun, je novou verziou RMI (Remote Method Invocation) pre IIOP (internetový protokol Inter-ORB), ktorá kombinuje jednoduché programovacie funkcie RMI s interoperabilitou CORBA. Táto nová verzia rozhrania RMI bola oficiálne vydaná v júni a bola voľne dostupná na webe spoločnosti Sun (informácie o tom, kde si ju môžete stiahnuť, nájdete nižšie v časti Zdroje). Referenčná implementácia spoločnosti Sun beží na Windows 9x / NT a Solaris. Je to štandardné rozšírenie, ktoré podporuje JDK 1.1.6 aj Java 2 Platform.

RMI a CORBA sa vyvinuli nezávisle ako programovacie modely distribuovaných objektov. RMI, základ technológií EJB a Jini, bolo predstavené ako ľahko použiteľný programovací model založený na prostredí Java pre distribuované objekty. CORBA (Common Object Request Broker Architecture), definovaná OMG (Object Management Group), je známy programovací model distribuovaných objektov, ktorý podporuje množstvo jazykov. Protokol IIOP spája produkty CORBA od rôznych dodávateľov a zaisťuje ich interoperabilitu. RMI-IIOP je v istom zmysle manželstvom spoločností RMI a CORBA.

Na účely tohto článku predpokladáme, že ste už boli oboznámení so základmi CORBA. Ak potrebujete ďalšiu pomoc pri naštartovaní, v časti Zdroje nižšie je užitočný odkaz.

Pred RMI-IIOP

Pozrite sa na obrázok 1 nižšie. Priestor nad stredovou vodorovnou čiarou predstavuje pôvodnú doménu RMI; dolný región predstavuje svet CORBA a IIOP. Tieto dva samostatné svety, ktoré sa vyvinuli nezávisle, neboli historicky schopné navzájom komunikovať. Napríklad natívny protokol RMI, JRMP (Java Remote Method Protocol), sa nemôže spojiť s inými protokolmi.

Ak jediným programovacím jazykom, ktorý v novom projekte požadujete, je Java, použitie RMI a JRMP - kombinácia označovaná ako RMI (JRMP) pre zvyšok tohto článku - je tradične najlepšou voľbou. Na rozdiel od CORBA, ktorá vyžaduje použitie pomerne komplikovaného rozhrania Language Definition Language (IDL), ponúka RMI (JRMP) pre milovníkov Java jednoduché programovanie. CORBA na druhej strane umožňuje programovanie distribuovaných objektov na rôznych platformách a v rôznych programovacích jazykoch. Vývojári potrebujú programovanie distribuovaných objektov nielen pre nové projekty, ale aj pre využitie starších softvérových zdrojov. Samozrejme, starší softvér je vo väčšine prípadov programovaný v iných jazykoch ako Java; v takýchto situáciách vývojári potrebujú CORBA, nie RMI (JRMP).

Máme teda našu ústrednú dilemu: RMI (JRMP) má výhodu ľahkého programovania, zatiaľ čo CORBA poskytuje interoperabilitu medzi viacerými programovacími jazykmi na rôznych platformách. Bohužiaľ však tradične neexistuje spôsob, ako obe tieto vynikajúce technológie využiť. To ukazuje graf na obrázku 2, v ktorom kruh predstavuje situáciu, v ktorej môže klient volať server, a písmeno X predstavuje prípad, v ktorom to nie je možné

To najlepšie z oboch svetov

Pri zakladaní nového projektu bolo ťažké zvoliť si medzi RMI (JRMP) a CORBA. Ak ste vybrali RMI (JRMP), máte jednoduché programovanie, ale stratili ste interoperabilitu vo viacerých jazykoch. Ak ste vybrali CORBA, získate interoperabilitu, ale čelili ste náročnejšej programátorskej úlohe. Používatelia RMI (JRMP) aj CORBA, unavení týmto rozhodnutím, povedali jedným hlasom: „Prosím, spojte ich.“

Na obrázku 3 nižšie horná časť predstavuje model RMI (JRMP), stredná časť model RMI-IIOP a spodná časť model CORBA. Šípka predstavuje situáciu, v ktorej môže klient zavolať na server. RMI-IIOP patrí do sveta IIOP pod vodorovnú čiaru. Čo môže vyzerať zvláštne, sú diagonálne šípky, ktoré prekračujú hranice medzi svetom JRMP a svetom IIOP, čo znamená, že klient RMI (JRMP) môže volať server RMI-IIOP a naopak. Je prirodzené, že si čitatelia myslia, že tieto diagonálne šípky sú nesprávne - koniec koncov, rôzne protokoly nikdy nemôžu spolu hovoriť, však? Tieto šípky sú však v skutočnosti na správnom mieste. RMI-IIOP podporuje oba JRMP a Protokoly IIOP.

Serverový binárny súbor (tj. Súbor triedy) vytvorený pomocou rozhraní API RMI-IIOP je možné exportovať ako JRMP alebo IIOP. Pri zmene z JRMP na IIOP nemusíte prepisovať jeho zdrojový kód Java ani ho znovu kompilovať alebo naopak. Pri jeho spustení stačí zmeniť parametre, ako sú napríklad vlastnosti systému Java. Alternatívne môžete určiť použitý protokol tak, že ho zadáte v zdrojovom kóde Java. Rovnaká flexibilita platí pre kód klienta RMI-IIOP.

Duálny export

Pri rozhodovaní medzi protokolmi JRMP a IIOP je treba mať na pamäti ešte jednu dôležitú skutočnosť. Keď exportujete objekt RMI-IIOP na server, nemusíte si nevyhnutne vyberať medzi JRMP a IIOP. Ak potrebujete jeden objekt servera na podporu klientov JRMP aj IIOP, môžete exportovať svoj objekt RMI-IIOP do JRMP aj IIOP súčasne. V terminológii RMI-IIOP sa to nazýva duálny vývoz.

Diagonálne šípky na obrázku 3 sú možné, pretože API RMI-IIOP podporujú protokoly JRMP aj IIOP. To znamená, že bez prepisovania zdrojového kódu objektu RMI (JRMP) ho môže volať nový klient RMI-IIOP. Podobne môžete bez prepisovania zdrojového kódu klienta RMI (JRMP) nahradiť objekt servera RMI (JRMP) novým objektom RMI-IIOP, ktorý môže klient CORBA aj volať. RMI-IIOP teda zachováva existujúce investície do binárnych súborov RMI (JRMP), pretože RMI-IIOP s nimi môže komunikovať bez akýchkoľvek zmien zdrojového kódu alebo opätovnej kompilácie.

Táto interoperabilita s RMI (JRMP) bola jedným z princípov návrhu RMI-IIOP. Dizajnéri RMI-IIOP sa vyhli pokušeniu vytesniť CORBA a RMI tretím programovacím modelom, pretože by to len zmiatlo programátorov distribuovaných objektov a migráciu z RMI (JRMP) by ešte sťažili.

Interoperabilita s CORBA

Pozerajte sa znova na obrázok 3. Sekcia pod vodorovnou čiarou je svetom IIOP, kde klient RMI-IIOP volá server CORBA a klient CORBA volá server RMI-IIOP. O Klient RMI-IIOP, máme na mysli klientsky program, ktorý napísal programátor RMI, ktorý nevie nič o CORBA alebo IDL. Rovnako tak a Klient CORBA je klientsky program, ktorý bol napísaný programátorom CORBA ignorujúcim RMI. Oddelenie rozhrania od implementácie je osvedčenou technikou, ktorá umožňuje programátorom získať prístup k rôznym zdrojom bez potreby vedieť, ako sú tieto zdroje implementované; pri dodržaní tejto techniky môžu používatelia serverov RMI-IIOP a CORBA využívať služby druhého protokolu, ak môžu získať prístup k jeho rozhraniu. Súbor rozhrania RMI Java je rozhraním pre používateľov RMI-IIOP, zatiaľ čo IDL je rozhraním pre používateľov CORBA; interoperabilita medzi RMI-IIOP a CORBA na obrázku 3 sa dosahuje poskytnutím každého používateľa jeho očakávaného rozhrania pri súčasnom skrytí skutočnej implementácie.

Posledný detail, ktorý je potrebné vysvetliť na obrázku 3, je bodkovaná šípka označujúca klienta RMI-IIOP volajúceho na server CORBA. Prečo je iba táto šípka bodkovaná? Klient RMI-IIOP nemôže nevyhnutne získať prístup ku všetkým existujúcim objektom CORBA. Sémantika objektov CORBA definovaných v IDL je nadradenou sadou objektov RMI-IIOP, a preto nie je možné IDL existujúceho objektu CORBA vždy mapovať do rozhrania Java RMI-IIOP. Iba vtedy, keď sémantika konkrétneho objektu CORBA korešponduje so sémantikou objektu RMI-IIOP, môže klient RMI-IIOP zavolať objekt CORBA. Bodkovaná šípka označuje spojenie, ktoré je niekedy - ale nie vždy - možné.

Tu by sa však nekompatibilita nemala preháňať. Obmedzenia označené bodkovanou šípkou sa uplatňujú iba pri práci s existujúcimi objektmi CORBA. Predpokladajme, že navrhnete úplne nový distribuovaný objekt s rozhraním Java RMI-IIOP. V takom prípade môžete automaticky vygenerovať príslušné IDL pomocou súboru rmic nástroj. Z tohto súboru IDL ho môžete implementovať ako objekt CORBA - napríklad v C ++. Tento objekt C ++ je čistý objekt CORBA, ktorý je možné volať klientom CORBA, a bez obmedzenia ho možno nazvať aj klientom RMI-IIOP. Pre klienta RMI-IIOP sa tento objekt C ++ CORBA javí ako čistý objekt RMI-IIOP, pretože je definovaný rozhraním Java RMI-IIOP. Stručne povedané, rozdiel medzi objektom CORBA a objektom RMI-IIOP je iba otázkou implementácie. Rovnako, ak je objekt implementovaný v RMI-IIOP, objekt sa klientovi CORBA javí ako objekt CORBA, pretože klient CORBA k nemu pristupuje prostredníctvom svojho IDL.

Obrázok 4 nižšie zobrazuje maticu, ktorá sumarizuje šípky na obrázku 3. Bodkovaný kruh znamená to isté, čo bodkovaná šípka na obrázku 3. Obrázok 4 ukazuje, že ak implementujete svoj server v RMI-IIOP, máte najširší výber klientov. Rovnako, ak implementujete svojho klienta v systéme RMI-IIOP, môžete hovoriť s najširšou škálou serverov, aj keď v prípade existujúcich objektov CORBA existujú určité obmedzenia, čo naznačuje bodkovaný kruh.

Politika návrhu RMI-IIOP

Dizajn protokolu RMI-IIOP formovali dva hlavné predpoklady: sémantika RMI musela byť ponechaná čo najviac nedotknutá a bolo potrebné vylepšiť CORBA, aby bolo možné sémantiku RMI implementovať pomocou infraštruktúry CORBA. Toto sa ľahšie hovorilo ako robilo. Keby bol predstavený tretí programovací model, programátorov by to iba zmiatlo. Na dosiahnutie šťastného manželstva spoločností RMI a CORBA bolo potrebné dosiahnuť kompromis medzi rozdielnym prostredím týchto manželských partnerov - ak by obaja partneri akýkoľvek kompromis odmietli, manželstvo by sa nedostalo nikam. Komunita CORBA to našťastie uznala a prijala určité zmeny, aby sa RMI-IIOP mohol stať realitou.

Dve hlavné zmeny, ktoré CORBA prijala, boli: Predmety podľa hodnoty a Mapovanie Java na IDL technické údaje. Prvý z nich, ktorý je už k dispozícii používateľom RMI vo forme serializácie objektov Java, je špecifikáciou CORBA, ktorá má umožniť iným jazykom implementovať podobnú schopnosť. Posledným menovaným je mapovanie používané na prevod rozhraní RMI Java na definície CORBA IDL a nesmie sa zamieňať s mapovaním IDL na Java, ktoré je už definované v CORBA 2.2. (Odkazy na tieto dve nové špecifikácie CORBA nájdete v zdrojoch.)

OMG už oficiálne prijal obe špecifikácie pre CORBA 2.3, ale implementácie CORBA budú musieť túto novú verziu dobehnúť skôr, ako sa nové manželstvo CORBA a RMI tu popísané stane rozšírenou realitou. Napríklad kompilátor IDL-to-Java, ktorý vyhovuje CORBA 2.3, je k dispozícii od spoločnosti Sun na použitie v spojení s RMI-IIOP ORB (sprostredkovateľ požiadaviek na objekty), ale v súčasnosti je to verzia s prednostným prístupom vhodná iba na preskúmanie interoperability CORBA a RMI-IIOP, a nie na produkčné použitie. Ďalej kompilátor IDL-to-Java distribuovaný spoločnosťou Sun na použitie s Java IDL ORB v prostredí Java 1.2 nie je v súlade s CORBA 2.3, takže ho nemožno použiť na testovanie interoperability s RMI-IIOP. Táto situácia bude vyriešená v priebehu najbližších mesiacov, keď budú dodávatelia CORBA predstavovať nové verzie svojich produktov, ktoré podporujú CORBA 2.3. Napríklad ďalšie vydanie platformy Java 2 Standard Edition bude obsahovať RMI-IIOP aj kompilátor IDL-to-Java v produkčnej kvalite, ktorý podporuje CORBA 2.3.

Postup vývoja

Obrázok 5 nižšie zobrazuje vývojové postupy pre servery RMI-IIOP aj pre klientov. Všimnete si, že sú takmer rovnaké ako v RMI (JRMP). Rovnako ako v RMI (JRMP) je definíciou distribuovaného objektu jeho rozhranie RMI Java (MyObject.java na obrázku 5). Rozdiel je v -iiop parameter parametra rmic zostavovateľ. Táto možnosť sa používa na výrobu rmic generovať pahýly a kravaty, ktoré podporujú protokol IIOP. Bez toho -iiop možnosť, rmic generuje pahýľ a kostru pre protokol JRMP. Aj keď je vývojový postup pre RMI-IIOP podobný postupu pre RMI (JRMP), runtime prostredie je odlišné v tom, že komunikácia sa uskutočňuje prostredníctvom ORB kompatibilného s CORBA 2.3, pričom sa na komunikáciu medzi servermi a klientmi používa IIOP.

Ak uvažujete o prevedení kódu RMI (JRMP) na RMI-IIOP, mali by ste si uvedomiť, že pri spustení cez IIOP existujú určité implementačné rozdiely. Distribuovaný zber odpadu nepodporuje program CORBA, ktorý používa explicitné ničenie a trvalé odkazy na objekty s transparentnou pasiváciou a aktiváciou. Register RMI je nahradený JNDI s CosNaming alebo poskytovateľa služieb LDAP a aktivácia RMI je nahradená adaptérom prenosného objektu. Diaľkové odkazy na objekty musia byť pomocou programatického prostredia downcast úzky () metóda namiesto priameho obsadenia jazykom Java. Ostatné sémantiky RMI, ako napríklad serializácia objektov, sú cez IIOP plne podporované.

Postup interoperability CORBA

Obrázok 6 ukazuje, ako dosiahnuť interoperabilitu medzi RMI-IIOP a CORBA. Aby sme našu diskusiu zjednodušili, zvážme dva aspekty takejto interoperability: klienta CORBA používajúceho objekt RMI-IIOP, ktorý je znázornený v ľavej časti obrázka 6, a klienta RMI-IIOP, ktorý používa objekt CORBA, zobrazený v úplne pravej časti. V strede obrázku sú tie zdieľané procesy, ktoré umožňujú fungovanie oboch foriem interoperability.

$config[zx-auto] not found$config[zx-overlay] not found