Java RMI (Remote Method Invocation) Gruppe 9: Ivar Steien Rasmussen Tom Anders Dalseng Andreas Petlund
Antagelser og forutsetninger Implementasjonseksemplet kompileres og kjøres på Java SDK 1.4.2 Dokumentasjon er hentet fra versjoner 1.3.1 tom 1.4.2.
Arkitektur Oversikt over lagene Klient Applikasjonslaget Tjener Stub Proxylaget Skeleton Fjernreferanselaget Transportlaget Formålet med RMI er å få objekter på separate virtuelle maskiner til å se ut som, og oppføre seg som lokale objekter Dette oppnås ved hjelp av to spesielle objekter: Stub: Klientsideobjektet som representerer de fjerne objektene. Skeleton: Serversideobjekt som tar seg av alle detaljene med fjerne kall.
Arkitektur Applikasjonslaget Har ikke noe Interface Description Layer (IDL) Server Applikasjonen: Implementerer de fjerne metodene klienten bruker Eksporterer objektene med metoder som blir kalt fjernt (ved å extende UnicastRemoteObject ) Registrerer seg selv med rmi registry Klient applikasjonen Får referanse til fjerne objekter Caster objektet som et fjernt interface Benytter seg av de fjerne metodene
Arkitektur Proxylaget Stub: Stubben er klientens proxy til det fjerne objektet Den skriver/sender parametere til det fjerne objektet Den leser retur verdien eller exception og gir den til den som utførte kallet Skeleton: Skeleton er serverens proxy for det fjerne objektet Den leser innkommende parametre Den starter den faktiske metoden Den skriver/sender retur parametre
Arkitektur Fjernreferanselaget Er en abstraksjon mellom proxylaget og transportlaget Tar seg av kommunikasjon mellom stub og skeleton via transportlaget Har diverse avanserte funksjoner og mulighet for fremtidlig utvikling: Aktivering av fjerne objekter fra klient Connection recovery Kommunikasjon med flere servere/multi cast (ikke implementert) Og mer
Arkitektur Transportlaget RMI Transportlaget benytter TCP/IP som default. Kan spesifisere ut fra dine behov Andre protokoller Krypterte streams Komprimerte streams Andre sikkerhet og ytelse forhold/forbedringer
Security Manager Brukes til å begrense hva som kan utføres av kode som lastes ned til ditt system. Du kan spesifisere din egen security policy i en fil som sendes med ved oppstart: Java Djava.security.policy=policyfilename JDK inneholder et verktøy som kan brukes til å generere policy-filer. Uten å spesifisere en security manager, vil ikke den distribuerte applikasjonen tillate nedlasting og utføring av kode fra en annen maskin.
RMI Name Registry RMI Name Registry brukes til å registrere alle de tilgjengelige fjernobjektene som ligger på en spesifikk server RMI Name Registry åpner (som default) en port på 1099 og lytter på denne Kjører på samme maskin som fjernobjektene Hver maskin som tilbyr fjernobjekter må kjøre RMI Name Registry
Implementasjonseksempel: Ping Definere funksjonen til fjernklassen som et interface import java.rmi.remote; import java.rmi.remoteexception; } public interface Ping extends Remote { String ping() throws RemoteException; Interface klassen må deklareres public. Hvert interface må extende java.rmi.remote interfacet. Hver metode må kaste RemoteException. Alle fjernobjekter som skal benyttes som parametre eller returverdier må være deklarert som remoteinterface typen. (f.eks Ping, ikke PingImpl)
Implementasjonseksempel: Ping Skrive implementasjonen av server-klassen Klassen må implementere fjern-interfacet. public class PingImpl extends UnicastRemoteObject implements Ping { UnicastRemoteObject: Kan benyttes til å opprette et objekt som har følgende egenskaper: Bruker RMIs standard socket-baserte transport (TCP/IP). Kjører hele tiden...alternativet - Activatable: Kan benyttes til å opprette et objekt som har følgende egenskaper: Objektet blir opprettet og kjørt kun ved behov, i motsetning til å kjøre hele tiden. For å endre kommunikasjonsinnstillinger kan man implementere interfacet RMIClientSocketFactory
Implementasjonseksempel: Ping Konstruktøren til et fjern-objekt public PingImpl() throws RemoteException { super(); } Klasser som extender UnicastRemoteObject blir eksportert ved å kalle super() dvs gjøres mottakelige for fjernkall. super() er konstruktøren i java.rmi.server.unicastremoteobject. Man kan eksportere andre fjernobjekter ved å kalle UnicastRemoteObject.exportObject(). Dette gjøres fra konstruktøren. Activatable-objekter har en tilsvarende eksport metode. Konstruktøren må kaste RemoteException pga av at eksporten kan feile hvis kommunikasjonsressursene ikke er tilgjengelige.
Implementasjonseksempel: Ping Konstruktøren til et fjern-objekt - forts. public ActivatableImplementation(ActivationID id, MarshalledObject data) throws RemoteException { // Register the object with the activation system // then export it on an anonymous port super(id, 0); }
Implementasjonseksempel: Ping Implementasjon av metoden public String ping() throws RemoteException { return pong ; } Argumenter kan være alle datatyper for java-plattformen Objekter må implementere java.io.serializable. Lokale objekter blir kopiert. Det sendes en referanse til en stub ved fjernkall.
Implementasjonseksempel: Ping Security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } Garanterer at klasser som blir lastet ikke utfører operasjoner som ikke er lov. Kjøres fra main() i server og klient. I applets brukes den innebygde security manageren i klientens nettleser.
Implementasjonseksempel: Ping Instansiering av fjernobjekter PingImpl obj = new PingImpl(); Dersom man bruker UnicastRemoteObject, må serveren opprette en eller flere instanser av fjernobjektene. Større oppgave å sette opp et activatable objekt.
Implementasjonseksempel: Ping Instansiering av fjernobjekter Naming.rebind("//viisi/PingServer", obj); Binder et URL-formatert navn til fjernobjektet, og registrerer det i RMI Registry. Brukes av klienten til å lokalisere det første fjernobjektet. Det første objektet tar seg av å finne referanser til andre relevante objekter. rmiregistry bruker port 1099. Man kan evt spesifisere en annen port hvis dette er nødvendig. Naming.rebind ("//viisi:1234/pingserver, obj); Det andre parameteret er en referanse til objektimplementasjonen. Av sikkerhetsgrunner kan en server-applikasjon kun binde seg til et register som ligger på samme vert. Oppslag derimot kan gjøres fra en hvilken som helst vert
Implementasjonseksempel: Ping Klienten obj = (Ping)Naming.lookup("//viisi/PingServer"); Lager en stub som brukes for å kalle lookup-metoden på serveren. Returnerer en instans av PingImpl_stub som er bundet til navnet som ble gitt som parameter. Nå kan applikasjonen gjøre kall til fjernobjektet som om det lå lokalt.
Implementasjonseksempel: Ping Verktøy og kompilering Koden kompileres på vanlig måte med javac. Etterpå kjøres verktøyet rmic på klassefilen som genereres fra rmi interfacekoden. rmic genererer bytekode til stub og skeleton for fjerninterfacet. Oppslagstjenesten startes med rmiregistry <portnr>.
Java RMI vs. CORBA Java RMI CORBA Støttede språk Java Java, C++, C, Smalltalk, osv.. Tjenester Navnetjeneste Navnetjeneste, persistens, transaksjoner osv.. Oppsett og programmering Enkelt Mer komplekst. Skalerbarhet God Utmerket (avhenging av leverandør). Ytelse God Utmerket (avhengig av leverandør). CORBA lar deg bruke det programmeringsspråket du ønsker. Java RMI forutsetter Java. CORBA er optimalisert for større, mer skalerbare systemer der du kanskje opererer med tusenvis av objekter. CORBA er mer kompleks å programmere og sette i drift. CORBA har støtte for et bredt spekter av ekstratjenester for f.eks transaksjoner, sikkerhet, persistens osv.
Java RMI vs. CORBA Fordeler med Java RMI: Ingen ekstra kompileringssteg. Kompakt implementasjon. Overføring av data og kode. Klienten kan laste ned stub fra serveren. Ulemper: Begrenset til Java Proprietær standard Dårlig ytelse (halvparten så rask som ORBACUS)
Java RMI vs. ORBACUS Fordeler med CORBA: Skalerbarhet. Ytelse. Ekstratjenester. Ulemper: Mer komplisert i oppsett og programmering. Selv om CORBA er en åpen standard, er de fleste implementasjoner kommersielle.
Kilder Twisted Transistor Introduction to Java Distributed Objects Using RMI and CORBA Java Remote Method Invocation (a (very) short introduction) University of Stuttgart. Institute of Parallel and Distributed High-Performance Systems. Java.sun.com Java RMI Tutorial.
Spørsmål?