RMI Remote Method Invocation Tato technologie vyuv vzdlen

  • Slides: 15
Download presentation
RMI = Remote Method Invocation Tato technologie využívá vzdálené objekty tím, že volá jejich

RMI = Remote Method Invocation Tato technologie využívá vzdálené objekty tím, že volá jejich metody. Argumenty metod jsou požadavky a metoda případně vrátí výsledek. Vzdálený objekt existuje v jiné JVM - povětšinou na jiném počítači. Klient komunikuje se vzdáleným objektem pouze přes interfejs, který: • musí být potomkem interfejsu Remote • všechny jeho metody throws Remote. Exception Vlastní vzdálený objekt, tj. implementace, musí být: • realizací programátorem definovaného interfejsu • potomkem třídy - java. rmi. server. Unicast. Remote. Object či Activatable ( ta zařídí export ) - anebo musí být explicitně exportován metodou java. rmi. server. Unicast. Remote. Object. export(. . . ). PJV 14 1

Klient - Server Vývojář odpovídá pouze za definice interfejsů a implementujících tříd nemusí se

Klient - Server Vývojář odpovídá pouze za definice interfejsů a implementujících tříd nemusí se starat o komunikační protokol. Původně musel zajistit generaci stubu a sketetonu pomocí dodatečného kompilátoru rmic – od verze 1. 5 se tyto vytvářejí automaticky. JVM Java RMI client Java RMI server (application layer) stub socket factory RRL Transport skeleton RRL socket layer Transport layer JRMP on TCP/IP RRL = Remote Reference Layer PJV 14 2

RMI Unicast Remote. Object Moje. Trida registry Registry stub Security Remote Manager Muj. Interfejs

RMI Unicast Remote. Object Moje. Trida registry Registry stub Security Remote Manager Muj. Interfejs rmic client server Muj. Interfejs program new skel stub RMI / IIOP eton object Pro v 1. 2 je skeleton integrován v Unicast. Remote. Object PJV 14 3

Spouštění RMI 1. Server vytvoří jeden vzdálený objekt a předá serializovaný stub do registry

Spouštění RMI 1. Server vytvoří jeden vzdálený objekt a předá serializovaný stub do registry k registraci. Ten realizuje výpočet i pro více klientů. 2. Klient získá od registry handle ke vzdálenému objektu. 3. Registry mu vrátí serializovanou kopii stubu. Klient z ní vytvoří instanci stubu. Pro další komunikaci klient-server není registry nutná. 1. Klientský program zavolá nějakou metodu stubu. 2. Stub kontaktuje skeleton v serveru. 3. Skeleton zavolá metodu vzdáleného objektu. Při každém zavolání vytvoří server nové vlákno, které provede výpočet v metodě. 4. Metoda vrátí výsledek skeletonu. 5. Skeleton vrátí výsledek stubu. 6. Stub vrátí výsledek klientskému programu. PJV 14 4

 javax. management. remote. rmi Remote RMIServer java. rmi. * RMIServer RMIIIOP Impl Server.

javax. management. remote. rmi Remote RMIServer java. rmi. * RMIServer RMIIIOP Impl Server. Impl ( tag interface ) RMIJRMP java. rmi. registry Registry Server. Impl Locate Registry java. rmi. dgc Distributed Garbage Collection DGC Lease VMID java. rmi. activation Marshalled Object Naming Activation. Instantiator Activation. Monitor Activation java. lang Desc Group. Desc Security Manager Activation. System Activator PJV 14 Activation ID Group. ID RMISecurity Manager 5

java. rmi. server tag interface java. rmi Remote Object Remote java. io java. rmi.

java. rmi. server tag interface java. rmi Remote Object Remote java. io java. rmi. activation javax. rmi. CORBA. Stub Remote Stub _Remote_Stub Remote Server Unreferenced Remote. Object Impl java. rmi. activation RMIConnection Activation Group Impl_Stub RMIServer javax. management. remote. rmi RMIClass Loader. Spi RMIClass Loader Activation Group_Stub java. rmi. activation PJV 14 Remote. Ref Server. Ref Unicast RMIConnection RMIClient. Socket. Factory Activable Externalizable RMISocket Factory UID Activation. Instantiator java. rmi. activation RMIServer. Socket. Factory Obj. ID Portable Remote. Object RMIFailure. Handler 6

interfejs java. rmi. Registry public void bind( String name, Remote obj ) throws Remote.

interfejs java. rmi. Registry public void bind( String name, Remote obj ) throws Remote. Exception, Already. Bound. Exception, Access. Exception public void unbind( String name ) throws Remote. Exception, Not. Bound. Exception, Access. Exception public void rebind( String name, Remote obj ) throws Remote. Exception, Access. Exception public String[ ] list( ) throws Remote. Exception, Access. Exception public Remote lookup( String name ) throws Remote. Exception, Not. Bound. Exception, Access. Exception PJV 14 7

Registry čili registratura umožňuje evidovat vzdálené objekty pod jednoduchým jménem. Klient jejím prostřednictvím může

Registry čili registratura umožňuje evidovat vzdálené objekty pod jednoduchým jménem. Klient jejím prostřednictvím může navázat spojení se serverem. Registry není perzistentní. Může být spuštěna v rámci OS nebo JVM. Každý servrový proces může udržovat vlastní registry nebo sdílet jedinou podporující všechny virtuální stroje na lokálním systému. Registry se vytvoří zavoláním rmiregistry. exec [ port | 1099 ], z adresáře classes anebo se tam zkopíruje jdk/bin. ( Ve Windows je třeba zkopírovat také jli. dll, tj. application extension. ) Registry se ovládá statickými metodami třídy java. rmi. Naming: bind, unbind, rebind, list a lookup PJV 14 8

Použití Registry reg = Locate. Registry. create. Registry( port ); //SINGLETON reg. bind( "Moje",

Použití Registry reg = Locate. Registry. create. Registry( port ); //SINGLETON reg. bind( "Moje", new Moje. Trida( ) ); Spuštění zevnitř: Runtime. get. Runtime( ). exec( "rmiregistry" ); Runtime. get. Runtime( ). exec( "rmid –J-Djava. security. policy=rmid. policy" ); javaw – background in Win PJV 14 9

Využití RMI Naming Service Klient vyhledá vzdálený objekt jménem takto: rmi: //host: port/name v

Využití RMI Naming Service Klient vyhledá vzdálený objekt jménem takto: rmi: //host: port/name v metodě Naming. lookup. ( Defaultně: rmi localhost 1099. ) Např. : String id = "rmi: //" + host + ": " + port + "/Moje" ; Muj. Interfejs z = ( Muj. Interfejs ) Naming. lookup(); z. metoda 1(. . . ); PJV 14 10

java. rmi. Marshalled. Object Po deserializaci instance Marshalled. Object není její obsah deserializován. Obsahuje

java. rmi. Marshalled. Object Po deserializaci instance Marshalled. Object není její obsah deserializován. Obsahuje totiž pole bytů, které může být později interpretováno jako objekt. Codebase URL je uložen uvnitř této struktury a ukazuje kde jsou příslušné classy uloženy pro automatické stažení. Tedy lze deserializovat na strojích nemající patřičnou třídu v classpath. Objekty mohou být předávány přes více strojů aniž jsou plně deserializovány. Array. List data =. . . Marshalled. Object mo = new Marshalled. Object( data ); Object o = mo. get( ); PJV 14 11

Dřívější příprava stubu a skeletonu Pro uskutečnění spojení mezi klientem a serverem je třeba

Dřívější příprava stubu a skeletonu Pro uskutečnění spojení mezi klientem a serverem je třeba na straně klienta vytvoří tzv. stub. ( V Javě 1. 1 bylo nutné ještě na straně serveru vytvářet tzv. skeleton. ) To zařizuje speciální kompilátor rmic, který se nalézá v j 2 sdk/bin/. . . Stub vytváří rmic podle třídy vzdáleného objektu. V JBuilderu je proto nutno u těchto tříd zvolit: -> Properties • Generate RMI stub/skeleton • Options: -keep –v 1. 2 Při rebuild se v patřičném podadresáři balíčku v classes. . . vytvoří Moje. Trida_Stub. class a v adresáři classesGenerated Source. . . Moje. Trida_Stub. java. PJV 14 12

Aktivace objektů Aktivatabilní objekty jsou zpravidla vedeny na separátní(ch) JVM. Tyto JVM se definují

Aktivace objektů Aktivatabilní objekty jsou zpravidla vedeny na separátní(ch) JVM. Tyto JVM se definují jako Activation Group - v ní je Activation Monitor, který sleduje všechny příslušné objektu a i tu grupu. Objekty i grupy mají ID a deskriptor. Activation group Activation. Group. ID Activation Monitor Activation. Group. Desc Activatable object Activation. ID Activation. Desc PJV 14 13

Aktivační grupy Aktivátor vytváří aktivační grupy. Tím je RMI démon v jdk/bin/rmid. exe Aktivační

Aktivační grupy Aktivátor vytváří aktivační grupy. Tím je RMI démon v jdk/bin/rmid. exe Aktivační grupy se vytvoří pomocí tříd z java. rmi. activation: Activation. Group. Desc gd = new Activation. Group. Desc( null, null ); Activation. Group. ID gi = Activation. Group. get. System( ). register. Group( gd ); Activation. Group. create. Group( gi, de, 0 ); // 0 – na kterémkoli portu PJV 14 14

Aktivatabilní objekty Implementace vzdáleného objektu je buď potomkem třídy Activatable • Activation. Group. create(.

Aktivatabilní objekty Implementace vzdáleného objektu je buď potomkem třídy Activatable • Activation. Group. create(. . . ) viz výše • String[ ] names = { , , }; • Marshalled. Object mo = new Marshalled. Object( names ); • Activation. Desc desc = new Activation. Desc( g. ID, " … ", null, mo ); • Registrovat takto: Remote. Object stub = ( Remote. Object ) Activatable. register(desc); • Naming. rebind( "My. RENOBject" , stub ); anebo je exportován: • V konstruktoru se přijme Activation. ID id a Marshalled. Object mo • names = ( String[ ] ) mo. get( ); • Activatable. export( this, id, 0 ); // export do RMIRegistry Tyto úpravy se týkají pouze serveru. Pro klienta je to transparentní. PJV 14 15