Java RMI Markus Foss Hans-Gunnar Vold Introduksjon Java Remote Method Invocation Tillater metodekall mellom Java virituelle maskiner Introdusert i Java 1.02 Javas svar på RPC, men er objekt orientert, med de fordelene det innebærer
Hvordan fungerer RMI? Binding RMIRegistry Kan kun inneholde referanser til lokale objekter av sikkerhetsmessige årsaker Et kallende objekt får tak i objektreferanser ved å slå opp her vha en URLformet streng Tjener: Naming.rebind("objektNavn", this) Klient: EnKlasse etobjekt = (EnKlasse)Naming.lookup("rmi://maskinNavn:port/objektNavn");
Binding Lokasjons- og migrasjonstransparens Ønsker man fullstendig lokasjons- og migrasjonstransparens må man benytte seg av JNDI istedenfor RMIRegistry
Parameteroverføring og returverdier Ved referanseoverføring Grensesnittet Remote må arves, og utvides med eksponerte metoder Dette implementeres i en klasse Metoder kaster RemoteException Det sendes en ROR (fjernobjektreferanse) som benyttes for å invokere metoder Ved verdioverføring Klassen må implementere Serializable Lokal kopi instansieres hos mottaker Predefinerte javaklasser som implemeterer Remote grensesnittet RemoteObject RemoteServer Activatable UnicastRemoteObject <servant class>
Dynamisk lasting av klasser Skjer via en filoverføringsprotokoll (lokalt filsystem, ftp eller http) Klienten må definere en URL til en codebase som inneholder den aktuelle klassen Codebase kan være en katalog eller en.jar fil Dynamisk lasting av klasser
Dynamisk lasting av klasser RMI klient RMIRegistry Tjener som har eksportert et fjernobjekt URL lokasjon (fil, ftp eller http) java.rmi.server.codebase= http://maskinnavn/katalognavn Kommunikasjonsprotokoller JRMP (Java Remote Message Protocol) Den opprinnelige Enkel RMI over IIOP Støtter kontekstinformasjon Transaksjoner Sikkerhet I prinsippet kan en hvilken som helst kommunikasjonsprotokoll benyttes, f.eks SOAP
Stub og skeleton kompilator rmic Genererer stubs og skeletons fra de kompilerte implementasjonsklassene For RMI-IIOP F.o.m. Java 1.2 kun stubs for JRMP (bruker reflection til å generere et skeleton i runtime) Er inkludert i Java SDK en Stub og skeleton kompilator
Distribuert garbage collection Reference-counting Leasing benyttes Klienter fornyer vanligvis leasene etter at halve leasingtiden har gått Kan være en flaskehals Sikkerhet Dynamisk lasting av klasser krever en security manager En predefinert: RMISecurityManager Restriktiv, begrenser bl.a lokale I/O operasjoner Lik applets sin security manager Eks: System.setSecurityManager(new RMISecurityManager())
Java RMI kontra CORBA IF definert i Java Kjørbar kode kan lastes dynamisk Distribuert garbage collection Enklere og mindre kildekode CORBA IDL IDL må rekompileres ved innføring av nye subklasser Ingen garbage collection Kodeeksempel Java RMI interface CORBA IDL package SimpleStocks; import java.rmi.*; import java.util.*; public interface StockMarket extends java.rmi.remote float get_price( String symbol ) throws RemoteException; module SimpleStocks interface StockMarket float get_price(in string symbol); ; ;
Kodeeksempel Java klientimplementasjon CORBA klient import java.rmi.*; import java.rmi.registry.*; import SimpleStocks.*; public class StockMarketClient public static void main(string[] args)throws Exception if(system.getsecuritymanager() == null) System.setSecurityManager(new RMISecurityManager()); StockMarket market = (StockMarket) Naming.lookup("rmi://localhost/NASDAQ"); System.out.println("The price of + MY COMPANY is + market.get_price("my_company") ); import org.omg.corba.*; import org.omg.cosnaming.*; import SimpleStocks.*; public class StockMarketClient public static void main(string[] args) try ORB orb = ORB.init(); NamingContext root = NamingContextHelper.narrow( orb.resolve_initial_references("nameservice")); NameComponent[] name = new NameComponent[1]; name[0] = new NameComponent("NASDAQ",""); StockMarket market = StockMarketHelper.narrow(root.resolve(name)); System.out.println("Price of MY COMPANY is " + market.get_price("my_company")); catch( SystemException e ) System.err.println( e ); Kodeeksempel Java tjenerimplementasjon package SimpleStocks; import java.rmi.*; import java.rmi.server.unicastremoteobject; public class StockMarketImpl extends UnicastRemoteObject implements StockMarket public float get_price( String symbol ) float price = 0; for( int i = 0; i < symbol.length(); i++ ) price += (int) symbol.charat( i ); price /= 5; return price; public StockMarketImpl( String name ) throws RemoteException try Naming.rebind( name, this ); catch( Exception e ) System.out.println( e ); CORBA tjener import org.omg.corba.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase public float get_price( String symbol ) float price = 0; for(int i = 0; i < symbol.length(); i++) price += (int) symbol.charat( i ); price /= 5; return price; public StockMarketImpl( String name ) super( name );
Kodeeksempel Java tjener import java.rmi.*; import java.rmi.server.unicastremoteobject; import SimpleStocks.*; public class StockMarketServer public static void main(string[] args) throws Exception if(system.getsecuritymanager() == null) System.setSecurityManager(new RMISecurityManager()); StockMarketImpl stockmarketimpl = new StockMarketImpl("NASDAQ"); CORBA tjener blalbla import org.omg.corba.*; import org.omg.cosnaming.*; import SimpleStocks.*; public class StockMarketServer public static void main(string[] args) try ORB orb = ORB.init(); BOA boa = orb.boa_init(); StockMarketImpl stockmarketimpl = new StockMarketImpl("NASDAQ"); boa.obj_is_ready( stockmarketimpl ); org.omg.corba.object object = orb.resolve_initial_references("nameservice"); NamingContext root = NamingContextHelper.narrow(object); NameComponent[] name = new NameComponent[1]; name[0] = new NameComponent("NASDAQ", ""); root.rebind(name, stockmarketimpl); boa.impl_is_ready(); catch( Exception e ) e.printstacktrace(); Konklusjon RMI er integrert i Java språket og svært enkelt å ta i bruk Mangler transparent støtte for sikkerhet, transaksjoner, osv.
Kilder http://java.sun.com/j2ee/1.3/docs/guide/rm i/index.html http://my.execpc.com/~gopalan/misc/comp are.html http://www.middlewarecompany.com/documents/samplecourse ware.pdf