Nastavenie Registrov

V predchádzajúcom príklade si všimnete volanie statickej metódy Naming.bind(). To však vyžaduje, aby bol register na danom počítači spustený v samostatnom procese. Názov servera registrov je rmiregistry. V 32bitovom operačnom systéme Windows napíšte:

start rmiregistry

Register bude spustený na pozadí. V systéme Unix bude tento príkaz vyzerať nasledovne:

rmiregistry &

Podobne ako rada iných sieťových programov je aj rmiregistry umiestneny na adrese IP ľubovoľného počítača, na ktorom svoj program spúšťate. Musí však byt schopný poslúchať port. Ak spustíte zmieneným spôsobom program rmiregistry bez argumentov, bude implicitným portom registrov port číslo 1099. ak chcete poslúchať iný port, musíte ho uviesť v argumente príkazového riadku. V predchádzajúcom príklade bol stanovený port číslo 2005, takže v 32bitovom operačnom systéme Windows musíte register rmiregistry.exe spustiť takto:

start rmiregistry 2005

Spustenie v systéme Unix bude vyzerať takto:

rmiregistry 2005 &

Údaje o porte a o adrese IP hosťujúceho register musia byť dostupne pred spustením príkazu bind(). Ak budete očakávať, že príklady volania RMI možno testovať rovnakým spôsobom ako všetky predchádzajúce programy, budete rozčarovaní. Sada JDK 1.1.1 obsahuje niekoľko problémov:

  1. Adresa miestneho hostiteľa s volaním RMI nespolupracuje. Ak chcete experimentovať s volaniami RMI na jednom počítači, musíte uviesť názov hostiteľského počítača. Ak chcete zistiť názov  počítača, musíte sa v 32bitovom systéme Windows presunúť na Štart - Nastavenia - Ovládacie panely - Sieť . Na karte Identifikácia v dialógovom okne Sieť nájdete textové pole s popisom Názov počítača.
  2. Volanie RMI nebude fungovať, dokedy nevytvoríte aktívne pripojenie TCP/IP. Toto pripojenie musíte vytvoriť, aj keď sa snažíte komunikovať so serverom umiestnenom na svojom počítači. Znamená to, že sa pred spustením programu musíte pripojiť ku svojmu poskytovateľovi pripojenia k sieti Internet (ISP). V opačnom prípade sa na vašej obrazovke začnú zobrazovať rôzne nezrozumiteľné chybové hlásenia.

Na základe toho by mal príkaz bind() vyzerať nasledovne:

Naming.bind("//perun:2005/PerfectTime",pt);

Ak používate však implicitný port 1099, nemusíte ho určovať explicitne. Stačí keď príkaz uvediete takto:

Naming.bind("//perun/PerfectTime",pt);

Mali by ste byt schopný testovať príklad aj miestne - bez pripojenia k sieti. Vypusťte teda adresu IP a použite iba identifikátor:

Naming.bind("PerfectTime",pt);

Uvedenie názvu služby je nepovinné; v tomto prípade je to zhodou okolností trieda PerfectTime (názov služby je zhodný z názvom triedy). Môžete však použiť ľubovoľný názov. Je ale dôležité, aby bol názov v registru jedinečný. Jedine tak môže klient prevziať odkaz na vzdialený objekt. V prípade, že sa vami zvolený názov už v registry vyskytuje, vygeneruje program výnimku typu AlreadyBoundException. Tomu sa však môžete elegantne vyhnúť použitím príkazu rebind() namiesto bind(). Príkaz rebind() totiž chýbajúci názov do registra pridá; existujúci proces jednoducho nahradí.
Aj keď metóda main() skončí, váš objekt bol vytvorený a registrovaný, takže vďaka registru existuje a čaká na požiadavky klientov. Doteraz je spustený register rmiregistry a dokedy nezavoláte metódu Naming.unbind() bude objekt existovať. Z tohoto dôvodu musíte pri vytváraní novej verzie vzdialeného objektu program rmiregistry vypnúť a opäť ho spustiť až po zostavení.
Register rmiregistry však nemusíte spúšťať ako vonkajší proces. ak viete, že tento register bude používaný iba vašou aplikáciou, môžete ho nasledujúcim príkazom spustiť vo vnútri programu:

LocateRegistry.createRegistry(2005);

Tak ako v predchádzajúcom príklade je číslo 2005 číslom nami vybraného portu. Tento príkaz je ekvivalentom spustenia príkazu rmiregistry 2005 na príkazovom riadku. Pri použití RMI je však často krát praktickejší, pretože eliminuje potrebu ďalších krokov súvisiacich so spúšťaním a vypnutím registra. Akonáhle vykonáte tento príkaz, môžete volať metódu bind() objektu Naming takisto ako v predchádzajúcom prípade.

Späť