RMI preko IIOP-a

Što je RMI preko IIOP-a?

RMI over IIOP (RMI-IIOP u daljnjem tekstu), koji su zajednički razvili IBM i Sun, nova je verzija RMI-a (daljinsko pozivanje metode) za IIOP (Internet Inter-ORB Protocol) koja kombinira jednostavne programske značajke RMI-a s CORBA-inom interoperabilnošću. Ova nova verzija RMI-a službeno je objavljena u lipnju i dostupna je na web mjestu Sun (pogledajte odjeljak Resursi u nastavku za informacije o tome gdje je možete preuzeti). Implementacija reference Sun pokreće se na sustavima Windows 9x / NT i Solaris. To je standardno proširenje koje podržava i JDK 1.1.6 i Java 2 platformu.

RMI i CORBA razvili su se neovisno kao modeli programiranja s distribuiranim objektima. RMI, temelj tehnologija EJB i Jini, predstavljen je kao model programiranja za distribuirane objekte koji se temelji na Javi. CORBA (Common Object Request Broker Architecture), definirana od strane OMG (Object Management Group), poznati je model programiranja s distribuiranim objektima koji podržava brojne jezike. IIOP protokol povezuje CORBA proizvode različitih dobavljača, osiguravajući međuoperabilnost među njima. RMI-IIOP je u neku ruku brak RMI-a i CORBE.

Za potrebe ovog članka pretpostavljamo da ste već upoznati s osnovama CORBE. Ako trebate dodatnu pomoć u ubrzanju, korisna je veza u odjeljku Resursi u nastavku.

Prije RMI-IIOP

Pogledajte sliku 1 dolje. Prostor iznad središnje vodoravne crte predstavlja izvornu domenu RMI-a; donja regija predstavlja svijet CORBE i IIOP-a. Ova dva odvojena svijeta, neovisno se razvivši, u povijesti nisu bila sposobna međusobno komunicirati. Na primjer, izvorni protokol RMI-a, JRMP (Java Remote Method Protocol), ne može se povezati s drugim protokolima.

Ako je jedini programski jezik koji vam je potreban u novom projektu Java, upotreba RMI i JRMP - kombinacija koja se u ostatku ovog članka naziva RMI (JRMP) - tradicionalno je najbolji izbor. Za razliku od CORBE, koja zahtijeva upotrebu prilično kompliciranog jezika sučelja (IDL), RMI (JRMP) nudi jednostavno programiranje za ljubitelje Jave. CORBA, s druge strane, omogućuje programiranje distribuiranih objekata na različitim platformama i različitim programskim jezicima. Programerima je potrebno programiranje distribuiranih objekata ne samo za nove projekte, već i za korištenje naslijeđenih softverskih resursa. Naravno, naslijeđeni softver je u većini slučajeva programiran na jezicima koji nisu Java; u takvim situacijama programeri trebaju CORBA, a ne RMI (JRMP).

Stoga imamo središnju dilemu: RMI (JRMP) ima prednost jednostavnog programiranja, dok CORBA pruža interoperabilnost između više programskih jezika na različitim platformama. Nažalost, međutim, tradicionalno nije postojao način za korištenje obje ove izvrsne tehnologije. To pokazuje grafikon na slici 2, u kojem krug označava situaciju u kojoj klijent može nazvati poslužitelj, a X označava slučaj u kojem to nije moguće

Najbolje od oba svijeta

Nekad je bilo teško odabrati između RMI (JRMP) i CORBA prilikom pokretanja novog projekta. Ako ste odabrali RMI (JRMP), dobit ćete jednostavno programiranje, ali izgubili ste interoperabilnost na više jezika. Ako ste odabrali CORBA, dobili ste interoperabilnost, ali suočili ste se sa zastrašujućim programskim zadatkom. I korisnici RMI-a (JRMP) i CORBA-e, umorni od donošenja ove odluke, u jedan su glas rekli: "Molim vas, spojite to dvoje."

Na slici 3 dolje, gornji odjeljak predstavlja model RMI (JRMP), srednji odjeljak model RMI-IIOP, a donji odjeljak model CORBA. Strelica predstavlja situaciju u kojoj klijent može nazvati poslužitelj. RMI-IIOP pripada svijetu IIOP-a ispod vodoravne crte. Ono što može izgledati čudno su dijagonalne strelice koje prelaze granicu između JRMP svijeta i IIOP svijeta, što podrazumijeva da RMI (JRMP) klijent može nazvati RMI-IIOP poslužitelj i obrnuto. Čitateljima je prirodno misliti da su ove dijagonalne strelice pogrešne - uostalom, različiti protokoli nikada ne mogu međusobno razgovarati, zar ne? Međutim, ove su strelice zapravo na pravom mjestu. RMI-IIOP podržava i JRMP i IIOP protokole.

Binarna datoteka poslužitelja (tj. Datoteka klase) stvorena pomoću RMI-IIOP API-ja može se izvesti kao JRMP ili IIOP. Ne morate prepisivati ​​njegov Java izvorni kôd niti ga prekompajlirati prilikom promjene s JRMP na IIOP ili obrnuto. Tijekom pokretanja trebate samo promijeniti parametre kao što su svojstva Java sustava. Alternativno, možete odrediti protokol koji se koristi tako da ga navedete u izvornom kodu Java. Ista fleksibilnost odnosi se na RMI-IIOP klijentski kod.

Dvostruki izvoz

Treba imati na umu još jednu važnu činjenicu prilikom odlučivanja između JRMP i IIOP protokola. Kada izvozite RMI-IIOP objekt na svoj poslužitelj, ne morate nužno birati između JRMP i IIOP. Ako vam je potreban jedan objekt poslužitelja za podršku i JRMP i IIOP klijentima, možete istovremeno izvesti svoj RMI-IIOP objekt i u JRMP i u IIOP. U terminologiji RMI-IIOP to se naziva dvostruki izvoz.

Dijagonalne strelice na slici 3 su moguće jer RMI-IIOP API-ji podržavaju i JRMP i IIOP protokole. To znači da ga novi RMI-IIOP klijent može pozvati bez ponovnog upisivanja izvornog koda RMI (JRMP) objekta. Slično tome, bez prepisivanja izvornog koda RMI (JRMP) klijenta, objekt RMI (JRMP) poslužitelja možete zamijeniti novim RMI-IIOP objektom koji CORBA klijent također može pozvati. Dakle, RMI-IIOP zadržava postojeće ulaganje u binarne datoteke RMI (JRMP), jer RMI-IIOP može komunicirati s njima bez ikakvih promjena izvornog koda ili ponovne kompilacije.

Ova interoperabilnost s RMI (JRMP) bilo je jedno od načela dizajna RMI-IIOP. Dizajneri RMI-IIOP izbjegli su iskušenje da istjeraju CORBA i RMI s trećim programskim modelom, jer bi to samo zbunilo programere distribuiranih objekata i učinilo migraciju s RMI-a (JRMP) još težom.

Interoperabilnost s CORBA-om

Ponovno pogledajte sliku 3. Odjeljak ispod vodoravne crte svijet je IIOP-a, gdje RMI-IIOP klijent poziva CORBA poslužitelj, a CORBA klijent RMI-IIOP poslužitelj. Pod RMI-IIOP klijentom mislimo na klijentski program koji je napisao RMI programer koji ne zna ništa o CORBI ili IDL-u. Isto tako, klijent CORBA-eje klijentski program koji je napisao programer CORBA koji ne poznaje RMI. Odvajanje sučelja od implementacije dobro je uspostavljena tehnika koja programerima omogućuje pristup različitim resursima bez potrebe da znaju kako se ti resursi implementiraju; ako se slijedi ova tehnika, korisnici i RMI-IIOP i CORBA mogu koristiti usluge drugog protokola ako mogu dobiti pristup njegovom sučelju. Datoteka sučelja RMI Java sučelje je korisnicima RMI-IIOP, dok je IDL sučelje korisnicima CORBA; interoperabilnost između RMI-IIOP-a i CORBA-e na slici 3. postiže se pružanjem svakom korisniku očekivanog sučelja, a istinska implementacija ostaje skrivena.

Posljednji detalj koji će biti objašnjen na slici 3 je točkasta strelica koja označava RMI-IIOP klijenta koji poziva CORBA poslužitelj. Zašto je samo ova strelica točkasta? Klijent RMI-IIOP ne može nužno pristupiti svim postojećim CORBA objektima. Semantika CORBA objekata definiranih u IDL-u nadmoć je onih RMI-IIOP objekata, zbog čega IDL postojećeg CORBA objekta ne može uvijek biti mapiran u RMI-IIOP Java sučelje. Tek kada se semantika određenog CORBA objekta podudara sa semantikom RMI-IIOP, RMI-IIOP klijent može nazvati CORBA objekt. Točkasta strelica označava vezu koja je ponekad - ali ne uvijek - moguća.

Međutim, ovdje ne bi trebalo precijeniti nekompatibilnost. Ograničenja označena točkastom strelicom primjenjuju se samo kada se radi o postojećim CORBA objektima. Pretpostavimo da dizajnirate potpuno novi distribuirani objekt s RMI-IIOP Java sučeljem. U tom slučaju možete automatski generirati odgovarajući IDL pomoćurmicalat. Iz ove IDL datoteke možete ga implementirati kao CORBA objekt - na primjer u C ++. Ovaj objekt C ++ čisti je CORBA objekt koji može pozvati CORBA klijent, a može ga pozvati i RMI-IIOP klijent bez ikakvih ograničenja. Klijentu RMI-IIOP ovaj C ++ CORBA objekt izgleda kao čisti RMI-IIOP objekt jer je definiran RMI-IIOP Java sučeljem. Ukratko, razlika između CORBA objekta i RMI-IIOP objekta samo je stvar implementacije. Isto tako, ako se objekt implementira u RMI-IIOP, objekt se CORBA klijentu prikazuje kao CORBA objekt jer mu CORBA klijent pristupa putem svog IDL-a.

Slika 4 dolje prikazuje matricu koja sažima strelice na slici 3. Točkasti krug znači isto što i točkasta strelica na slici 3. Slika 4 pokazuje da, ako implementirate svoj poslužitelj u RMI-IIOP, imate najširi izbor klijentima. Isto tako, ako svoj klijent implementirate u RMI-IIOP, možete razgovarati s najvećim rasponom poslužitelja, iako postoje određena ograničenja u slučaju postojećih CORBA objekata, kao što je naznačeno točkastim krugom.

Politika dizajna RMI-IIOP

Dva su glavna preduvjeta oblikovala dizajn RMI-IIOP protokola: RMI semantiku trebalo je ostaviti što je više moguće netaknutom, a CORBA je trebalo poboljšati kako bi se RMI semantika mogla implementirati pomoću CORBA infrastrukture. To je bilo lakše reći nego učiniti. Kad bi se uveo treći model programiranja, to bi samo zbunilo programere. Da bi se stvorio sretan brak RMI-a i CORBE, bilo je potrebno postići kompromis između različitih sredina tih bračnih partnera - ako bi oba partnera odbila bilo kakav kompromis, brak neće doći nikamo. Srećom, zajednica CORBA to je prepoznala i prihvatila određene promjene kako bi RMI-IIOP mogao postati stvarnost.

Dvije glavne promjene koje je CORBA prihvatio bile su Objekti po vrijednosti i Specifikacije mapiranja Java-to-IDL . Prva, koja je već dostupna RMI korisnicima u obliku serializacije Java objekata, CORBA je specifikacija namijenjena da drugi jezici implementiraju sličnu sposobnost. Potonje je mapiranje koje se koristi za pretvaranje RMI Java sučelja u CORBA IDL definicije i ne smije se miješati s mapiranjem IDL-a u Java već definiranom u CORBA 2.2. (Pogledajte Resurse za poveznice na ove dvije nove CORBA specifikacije.)

OMG je već službeno prihvatio obje specifikacije za CORBA 2.3, ali implementacije CORBE morat će sustići ovu novu verziju prije nego što novi brak CORBE i RMI ovdje opisan postane široko rasprostranjena stvarnost. Na primjer, IDL-to-Java kompajler koji je u skladu s CORBA 2.3 dostupan je od Sun-a za upotrebu zajedno s RMI-IIOP ORB (posrednik zahtjeva za objektima), ali trenutno je verzija s ranim pristupom prikladna samo za istraživanje interoperabilnosti CORBA i RMI-IIOP, a ne za proizvodnju. Nadalje, IDL-to-Java kompajler koji je Sun distribuirao za upotrebu s Java IDL ORB u Javi 1.2 nije u skladu s CORBA 2.3, tako da se ne može koristiti za testiranje interoperabilnosti s RMI-IIOP. Ova će se situacija riješiti tijekom sljedećih nekoliko mjeseci jer dobavljači CORBA-e uvode nove verzije svojih proizvoda koji podržavaju CORBA 2.3.Na primjer, sljedeće izdanje platforme Java 2, standardno izdanje, uključuje i RMI-IIOP i IDL-to-Java kompajler kvalitetne produkcije koji podržava CORBA 2.3.

Postupak izrade

Slika 5 u nastavku prikazuje razvojne postupke i za RMI-IIOP poslužitelje i za klijente. Primijetit ćete da su gotovo isti kao oni iz RMI-ja (JRMP). Baš kao u RMI (JRMP), definicija distribuiranog objekta je njegovo RMI Java sučelje ( MyObject.javana slici 5). Razlika je -iiopparametar rmickompajlera. Ova se opcija koristi za rmicgeneriranje klica i kravate koji podržavaju IIOP protokol. Bez ove -iiopopcije rmicgenerira kvar i kostur za JRMP protokol. Iako je razvojni postupak za RMI-IIOP blizak onome za RMI (JRMP), runtime okruženje je drugačije jer se komunikacija vrši putem ORB-a usklađenog s CORBA 2.3, koristeći IIOP za komunikaciju između poslužitelja i klijenata.

Ako razmišljate o pretvaranju RMI (JRMP) koda u RMI-IIOP, trebali biste biti svjesni da postoje neke razlike u implementaciji prilikom izvođenja preko IIOP-a. Distribuirano sakupljanje smeća ne podržava CORBA, koji koristi eksplicitno uništavanje i trajne reference objekata s prozirnom pasivizacijom i aktivacijom. RMI registar zamjenjuje JNDI s CosNamingdavateljem usluga ili LDAP, a RMI aktivaciju zamjenjuje prijenosni objektni adapter. Udaljene reference objekata moraju se spustiti programskom narrow()metodom umjesto izravnog emitiranja Java jezika. Ostala semantika RMI-a, poput serializacije objekata, u potpunosti je podržana preko IIOP-a.

CORBA-in postupak interoperabilnosti

Slika 6 pokazuje kako postići interoperabilnost između RMI-IIOP i CORBA. Da bismo našu raspravu učinili jednostavnijom, razmotrimo dva aspekta takve interoperabilnosti: CORBA klijent koji koristi objekt RMI-IIOP, prikazan u krajnjem lijevom dijelu slike 6, i RMI-IIOP klijent koji koristi CORBA objekt, prikazan u krajnjem desnom dijelu. U središtu slike nalaze se oni zajednički procesi koji omogućuju rad oba oblika interoperabilnosti.