Začíname s Java RMI

1. Prehľad

Keď musia dvaja JVM komunikovať, je Java RMI jednou z možností, ako to dosiahnuť. V tomto článku zavedieme jednoduchý príklad predstavujúci technológiu Java RMI.

2. Vytvorenie servera

Na vytvorenie servera RMI sú potrebné dva kroky:

  1. Vytvorte rozhranie definujúce zmluvu klient / server.
  2. Vytvorte implementáciu tohto rozhrania.

2.1. Definovanie zmluvy

Najskôr vytvorme rozhranie pre vzdialený objekt. Toto rozhranie rozširuje java.rmi.Remote značkovacie rozhranie.

Okrem toho každá metóda deklarovaná v rozhraní hodí znak java.rmi.RemoteException:

verejné rozhranie MessengerService rozširuje Remote {String sendMessage (String clientMessage) vyvolá RemoteException; }

Upozorňujeme však, že RMI podporuje úplnú špecifikáciu Java pre podpisy metód, pokiaľ sa implementujú typy Java java.io.Serializable.

V ďalších častiach uvidíme, ako bude klient aj server používať toto rozhranie.

Pre server vytvoríme implementáciu, ktorá sa často označuje ako Vzdialený objekt.

Pre klienta knižnica RMI dynamicky vytvorí implementáciu nazvanú a Pahýľ.

2.2. Implementácia

Ďalej implementujme vzdialené rozhranie, ktoré sa opäť nazýva Vzdialený objekt:

verejná trieda MessengerServiceImpl implementuje MessengerService {@Override public String sendMessage (String clientMessage) {return "Client Message" .equals (clientMessage)? "Správa servera": null; } public String ExposedMethod () {/ * kód * /}}

Všimnite si, že sme skončili hodíRemoteException doložka z definície metódy.

Bolo by nezvyčajné, aby náš vzdialený objekt hodil a RemoteException pretože táto výnimka je zvyčajne vyhradená pre knižnicu RMI na zvýšenie komunikačných chýb s klientom.

Jeho vynechanie má tiež výhodu v zachovaní našej implementácie RMI-agnostik.

Tiež akékoľvek ďalšie metódy definované vo vzdialenom objekte, ale nie v rozhraní, zostávajú pre klienta neviditeľné.

3. Registrácia Služby

Po vytvorení vzdialenej implementácie musíme vzdialený objekt naviazať na register RMI.

3.1. Vytvorenie pahýľa

Najprv musíme vytvoriť pahýľ nášho vzdialeného objektu:

MessengerService server = nový MessengerServiceImpl (); MessengerService stub = (MessengerService) UnicastRemoteObject .exportObject ((MessengerService) server, 0);

Používame statické UnicastRemoteObject.exportObject spôsob vytvorenia našej implementácie útržku. Pahýľ je to, čo robí kúzlo komunikácie so serverom cez základný protokol RMI.

Prvý argument pre exportObject je objekt vzdialeného servera.

Druhým argumentom je prístav, ktorý exportObject používa na export vzdialeného objektu do registra.

Ak dáte hodnotu nula, znamená to, že nám je jedno, ktorý port exportObject použitie, ktoré je typické a zvolené tak dynamicky.

Bohužiaľ, exportObject () metóda bez čísla portu je zastaraná.

3.2 Vytvorenie registra

Môžeme vytvoriť register lokálne na našom serveri alebo ako samostatnú samostatnú službu.

Pre jednoduchosť vytvoríme server, ktorý je lokálny pre náš server:

Register registra = LocateRegistry.createRegistry (1099);

Vytvorí sa register, do ktorého môžu byť pahýle viazané servermi a objavené klientmi.

Tiež sme použili createRegistry metóda, pretože vytvárame register lokálne na serveri.

Register RMI je štandardne spustený na porte 1099. V Portu je možné zadať aj iný port createRegistry továrenská metóda.

Ale v samostatnom prípade by sme zavolali getRegistry, odovzdanie názvu hostiteľa a čísla portu ako parametrov.

3.3 Viazanie pahýľa

Väzme teda náš stub na register. Register RMI je zariadenie na pomenovanie, ako je JNDI atď. Tu môžeme postupovať podľa podobného vzoru a viazať náš pahýl na jedinečný kľúč:

registry.rebind ("MessengerService", stub); 

Vďaka tomu je vzdialený objekt teraz k dispozícii každému klientovi, ktorý dokáže vyhľadať register.

4. Vytvorenie klienta

Nakoniec napíšeme klienta, aby vyvolal vzdialené metódy.

Aby sme to dosiahli, najskôr nájdeme register RMI. Okrem toho vyhľadáme stub vzdialeného objektu pomocou obmedzeného jedinečného kľúča.

A nakoniec privoláme poslať správu metóda:

Register registra = LocateRegistry.getRegistry (); MessengerService server = (MessengerService) register .lookup ("MessengerService"); Reťazec responseMessage = server.sendMessage ("správa klienta"); Reťazec expectMessage = "Správa servera"; assertEquals (expectMessage, responseMessage);

Pretože prevádzkujeme register RMI na lokálnom počítači a predvolený port 1099, neprenášame žiadne parametre getRegistry.

Ak je register v skutočnosti na inom hostiteľovi alebo na inom porte, môžeme tieto parametre dodať.

Hneď ako vyhľadáme stub objekt pomocou registra, môžeme vyvolať metódy na vzdialenom serveri.

5. Záver

V tomto tutoriáli sme dostali krátke predstavenie Java RMI a toho, ako môže byť základom pre aplikácie klient-server. Sledujte ďalšie príspevky o niektorých jedinečných vlastnostiach RMI!

Zdrojový kód tohto tutoriálu nájdete na GitHub.


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