Java Remote Method Invocation Programmazione in Rete e Laboratorio Comunicazione distribuita Port1 Java VM1 Java VM2 Port 2 Matteo Baldoni Dipartimento di Informatica Universita` degli Studi di Torino C.so Svizzera, 185 I-10149 Torino baldoni@di.unito.it http://www.di.unito.it/~baldoni/didattica Invocazione di metodi sull oggetto 2 RMI: goal Rendere trasparente l invocazione remota di metodi su oggetti Java che risiedono su diverse Virtual machines (evoluzione di Remote Procedure Call, RPC) offrire un modello distribuito che preservi maggiormente la semantica degli oggetti Java rendere il piu semplice possibile la scrittura di applicazioni distribuite RMI è un ORB (Object Request Broker) ma non un CORBA (Common Object Request Broker Architecture) come stabilito dall OMG (Object Management Group) analogo a DCOM della Microsoft 3 Architettura RMI Supporta vari protocolli di invocazione: unicast, multicast Applicazione Livello Livello di riferimento Applicazione Livello Livello di riferimento Livello di Trasporto Rete Livello di Trasporto Si occupa della effettiva connessione, della identificazione degli oggetti remoti, del mezzo,, UDP (nota: RMI usa per ora solo ) Si occupa di preparare (marshalling) la remote call e gli oggetti per la trasmissione Ogni livello è indipendente dall altro! Skeleton per le versioni precedenti a Java 1.2 4 Architettura RMI RMI Il sistema RMI e` costituito da tre livelli per supportare flessibilità nella comunicazione Ogni livello ha le sue interfacce di comunicazione con relativi protocolli (e skeleton) layer: canale di comunicazione tra clients e server remote reference layer: supporto di diversi protocolli di invocazione tipo Unicast e Multicast transport layer: supporta la comunicazione a basso livello, tipo 5 Simile all invocazione di metodi locali i parametri dei metodi possono essere oggetti il polimorfismo e` supportato: oggetti diversi possono rispondere a stessi messaggi ma i client interagiscono con interfacce di oggetti () non con la loro implementazione (che sta nella VM remota) parametri passati per copia, non per referenza (passaggio per referenza solo dentro a una VM) Distributed Garbage Collector (DGC) 6 1
RMI in pratica L oggetto blu sulla desidera inviare un messaggio all oggetto rosso sulla, gli oggetti giallo e azzurro fanno parte dei parametri del messaggio L oggetto rosso sulla terminata l esecuzione restituisce l oggetto verde come valore di ritorno oppure solleva un eccezione RMI in pratica: Interfaccia Il client deve disporre di un interfaccia che descriva l oggetto È necessario che l interfaccia estenda java.rmi.remote Ogni metodo descritto puo` lanciare un eccezione di tipo java.rmi.remoteexception messaggio valore di ritorno o eccezione public interface Distributor extends java.rmi.remote { Job getnewjob() throws java.rmi.remoteexception; Job getnewjob(message msg) throws java.rmi.remoteexception; 7 8 RMI in pratica: Implementazione Il implementa la classe che esegue praticamente i metodi che sono descritti nell interfaccia remota Questa classe è necessario che estenda la classe java.rmi.server.unicastremoteobject (attualemente l unica disponibile, multicast in una futura versione) che rende accessibile le sue istanze remotamente (puo` creare uno per la classe) public class DistributorImpl extends java.rmi.server.unicastremoteobject implements Distributor { public Job getnewjob() throws java.rmi.remoteexception { 9 RMI in pratica: rmi, bind (rebind) Gli oggetti remoti sono individuati tramite un IP, un numero di porta e un nome (una stringa) server : processo pagine gialle Si registra l oggetto rosso presso il servizio di pagine gialle Non è necessario registrare l oggetto verde Naming.rebind Reference Layer: apertura di un server socket Lo è necessario durante il bind 10 RMI in pratica: rmi, bind (rebind) La classe Naming appartiene al package java.rmi rmi puo` anche essere attivato indipendentemente dal server tramite il comando rmi 2000 RMI in pratica: rmi, lookup Il client ottiene uno (surrogato dell oggetto rosso presso il client) tramite il server Deve conoscerne IP, porta e nome public DistributorImpl() throws RemoteException { porta java.rmi..locateregistry.createregistry(2000); Naming.rebind("rmi://130.192.239.145:2000/distributor",this); System.err.println("Failed to bind to RMI Registry"); System.exit(1); IP address nome oggetto Naming.lookup 11 12 2
RMI in pratica: rmi, lookup L oggetto è contattato tramite il server È necessario conoscerne l indirizzo IP, il numero della porta e il nome con cui è registrato RMI in pratica: client L oggetto blu invia un messaggio al surrogato oggetto rosso presso lo client Lo client inizializza la chiamata remota ed organizza i parametri da inviare Garbage collector: mantiene un riferimento all oggetto rosso: non puo` essere eliminato public class { Distributor server; Tipo definito dall interfaccia! public () { server = (Distributor)Naming.lookup( "rmi://130.192.239.145:2000/distributor ); catch(exception e) { System.out.println("Failed to find distributor" + e.getmessage()); 13 messaggio L oggetto giallo e azzurro vengono serializzati e organizzati per la spedizione (marshalling) 14 RMI in pratica: invio messaggio L oggetto è ora utilizzabile come un qualsiasi oggetto locale lo ne è un surrogato public class { public void process() { Job myjob = server.getnewjob(new Message("Richiesta Job!")); myjob.process(); System.out.println("Failed to receive job " + e.getmessage()); 15 RMI in pratica: connessione Il livello di trasporto è responsabile per una connessione, nel server ascolta le richieste in arrivo mantiene la tabella degli oggetti remoti nel particolare address space Scambia le informazioni con il reference layer Anche se c è un firewall Il livello di trasporto apre un socket per la connessione Connessione temporanea! 16 RMI in pratica: server RMI in pratica: la risposta Lo server riorganizza i parametri (unmarshalling) individua l oggetto da chiamare attivando il metodo desiderato (informazione contenuta nel pacchetto ricevuto) Attenzione non vi è nessun riferimento agli oggetti giallo e azzurro sul client passati come parametro: sono copie! Lo del server cattura e riorganizza il valore restituito dall evecuzione del metodo sull oggetto rosso Lo server invia allo del client un pacchetto contenente le informazioni raccolte (l oggetto verde) Invia valore di ritorno o eccezione 17 18 3
RMI in pratica: la risposta RMI in pratica: ricezione Il server esegue il metodo invocato ed invia il valore di ritorno come se la chiamata fosse locale Lo client riorganizza le informazioni ricevute o l eccezione sollevata La connessione viene quindi disattivata public DistributorImpl() throws RemoteException { public Job getnewjob(message msg) { System.out.println(msg); if( count < jobs.size()) { return (Job)jobs.elementAt(count++); else { System.exit(0); return null; 19 20 RMI in pratica: ricezione RMI: riassunto Il valore di ritorno è utilizzato come se fosse ora un oggetto locale ma non ha nessun riferimento con quello creato sul server (come per i parametri inviati con la chiamata) public class { public void process() { Job myjob = server.getnewjob(new Message("Richiesta Job!")); myjob.process(); System.out.println("Failed to receive job " + e.getmessage()); 21 Nell esempio che vedremo: javac *.java rmic -v1.2 DistributorImpl rmi 2000 & java DistributorImpl java Esegue il client Crea il file: DistributorImpl_Stub.class Senza l opzione viene creato anche il file DistributorImpl_Skel.class compatibile sia con Java 1.1 e 1.2 Attiva il server Attiva il server Dopo in bind è attivo un thread separato per gestire le richieste di connessione, termina con CTRL-C 22 RMI: dello Lo generato dal server deve essere disponibile al client ma questo, in genere, è Puo` essere scaricato tramite Web java.rmi.server.codebase property La proprieta` codebase indica dove cercare una classe remotamente È l analogo del CLASSPATH Protocolli: file, ftp, o http Web L informazione del codebase è memorizzata Naming.rebind nel file di criteri 23 Il server viene avviato specificando la proprieta` codebase java -Djava.rmi.server.codebase=http://Host/dirctory/ 24 4
RMI: security manager RMI: security manager RMISecurityManager con l associato file di criteri permette di scaricare mediante il protocollo È necessario un file di criteri public class { Distributor server; public () { System.setSecurityManager(new RMISecurityManager()); server = (Distributor)Naming.lookup( "rmi://130.192.239.145:2000/distributor ); catch(exception e) { System.out.println("Failed to find distributor" + e.getmessage()); 25 Per utilizzare il file di criteri nel client: java -Djava.security.policy=client.policy Per indicare da dove scaricare il file dal server: java - Djava.rmi.server.codebase=http://baldo.di.unito.it/~baldoni/dowload/ rmi1/ DistributorImpl grant file client.policy { permission java.net.socketpermission "130.192.239.145:1024-65535", "connect"; permission java.net.socketpermission "130.192.239.1:80", "connect"; ; 26 L oggetto inviati tramite RMI preservano il loro vero tipo Ma se il valore restituito è piu` specializzato di quello atteso dal client che succede? Download delle classi per trattare l oggetto specializzato! file di criteri Web 27 E se l oggetto inviato è piu` specializzato di quello atteso dal server? Download delle classi via durante l esecuzione del metodo sull oggetto (sul server) IL server necessita a sua volta di un per il controllo delle classi scaricate È nececessario un file di criteri per il anche per il server Il client deve specificare dove scaricare le classi 28 Bibliografia Web Web C. S. Horstmann, G. Cornell. Java 2 Tecniche Avanzate, McGrawHill, 2000. ISBN 88-386-4071-8. Capitolo 5. M. Risso. Java 2 Programmazione distribuita. Apogeo, 1999. ISBN 88-7303-608-2. file di criteri file di criteri 29 30 5