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:
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.