Introduzione a Java Remote Method Invocation (RMI)



Похожие документы
RMI. Java RMI RMI. G. Prencipe

Java Remote Method Invocation

Socket & RMI Ingegneria del Software - San Pietro

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Programmazione distribuita

RMI Remote Method Invocation

Programmazione di sistemi distribuiti

Esercitazione di Sistemi Distribuiti: Java RMI

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

RMI. Prova pratica di Sistemi Distribuiti:

Contesto e motivazioni Architettura e concetti di base Componenti di RMI RMIRegistry Interfacce, eccezioni e classi Lo sviluppo di una applicazione L

Sistemi Distribuiti. Anno Accademico Prof. Flavio De Paoli. Il modello ad oggetti

Remote Method Invocation (RMI)

appunti delle lezioni Architetture client/server: applicazioni client

RMI: metodi equals e hashcode

Programmazione di rete in Java

Parte II: Reti di calcolatori Lezione 10

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Il Gestore Eventi di OpenSPCoop i. Il Gestore Eventi di OpenSPCoop

Java: Compilatore e Interprete

Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati

appunti delle lezioni Architetture client/server: applicazioni server

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Prova Finale a.a. 2011/2012. Laboratorio 1: Introduzione a Java e Eclipse

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Introduzione alle applicazioni di rete

Dispensa di Informatica I.1

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Sistemi Distribuiti Multiagente A.A Informatica Magistrale Università di Bari

Cenni di programmazione distribuita in C++ Mauro Piccolo

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Le command line di Java

Java RMI (Remote Method Invocation)

Do-Dots Protocollo di comunicazione

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

Concetto di Funzione e Procedura METODI in Java

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Programmazione dei socket con TCP #2

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Registratori di Cassa

Programmazione a Oggetti Lezione 10. Ereditarieta

Protezione. Protezione. Protezione. Obiettivi della protezione

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Programmazione server-side: Java Servlet

Sistemi Operativi (modulo di Informatica II)

Web Services con Axis Delia Di Giorgio Anna Celada 1 marzo 2005

Corso di Informatica

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

PRACTICAL DEVELOPMENT OF A WEB SERVICE

RMI e Firewall. Una soluzione è offerta dal transport layer di RMI stesso

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Seminario di Sistemi Distribuiti RPC su SOAP

Reti di Telecomunicazione Lezione 6

Approccio stratificato

La prima applicazione Java con NetBeans IDE. Dott. Ing. M. Banci, PhD

Comunicazione fra oggetti distribuiti

Strumenti per la programmazione

Introduzione alla programmazione in C

Scrivere un programma in Java

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Esercitazioni di PROGETTAZIONE DEL SOFTWARE A.A

WoWords. Guida all uso: creare ed utilizzare le frasi. In questa guida è descritto come creare ed utilizzare le frasi nel software WoWords.

Main System Monitor Keyboard

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

Ambienti di Sviluppo

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Lezione 1 Introduzione

Airone Gestione Rifiuti Funzioni di Esportazione e Importazione

Ingegneria del Software. Presentazione del pattern Proxy

Java threads (2) Programmazione Concorrente

GESTIONE DEI PROCESSI

Corso di Reti di Calcolatori L-A

Inizializzazione degli Host. BOOTP e DHCP

Protocolli applicativi: FTP

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Транскрипт:

Introduzione a Java Remote Method Invocation (RMI) SAPIENZA Università di Roma Corso di Architetture Software Orientate ai Servizi E risuona il mio barbarico yawp sopra i tetti del mondo ( I sound my barbaric yawp over the roofs of the world ) [W. Whitman, Canto di me stesso, in Foglie d'erba]

Uno sguardo alla storia RPC / 1 Forniscono l astrazione per cui le chiamate a procedure (cioè funzioni) sono mascherate dietro a chiamate locali I client che invocano le procedure hanno l impressione che le chiamate siano eseguite localmente mentre, invece, il corpo delle chiamate è eseguito su un calcolatore remoto Nelle Remote Procedure Call (RPC), il server è il processo che gestisce effettivamente le chiamate sul calcolatore remoto. Il servizio remoto ha un'interfaccia ben definita attraverso un Interface Description Language (IDL). Fornisce una rappresentazione astratta della procedura in termini di parametri di input/output Essendo usato per descrizioni language-neutral, si rendono indipendenti le infrastrutture software ed i linguaggi di programmazione adottati su client e server e.g., client Java, server C++ Java RMI 2

Uno sguardo alla storia RPC / 2 Questa astrazione è fornita, lato client, dallo stub mentre, lato server, si parla di skeleton Lo stub e lo skeleton vengono automaticamente generati da un software specifico, residente sulle macchine client e server o ad esse destinato, prendendo come input l IDL. Lo stub converte le chiamate locali del client in messaggi inviati su Socket verso lo skeleton Lo skeleton riceve ogni chiamata tramite Socket e le converte effettivamente in chiamate locali, cattura l eventuale output che viene convertito in un sequenza di byte inviata sul Socket verso il client richiedente. Java RMI 3

Uno sguardo alla storia RMI Java riprese i concetti di: chiamate a procedure residenti su macchine remote; descrizione di operazioni e segnature condivise fra client e server; stub e skeleton; interpretandole secondo il proprio paradigma: metodi remoti; interfacce remote; oggetti remoti. Remote Method Invocation (RMI) Attenzione: RMI non è language-neutral! RMI è studiato per applicazioni distribuite su JVM residenti in macchine diverse. Java RMI 4

Architettura di RMI (fino a Java 1.2) Esiste un RMI Compiler che, a partire dall interfaccia del servizio, genera stub e skeleton, usati per la comunicazione remota Il client invoca i metodi dell oggetto remoto sullo stub. Lo stub fornisce la stessa interfaccia dell oggetto remoto. Si limita ad inoltrare le richieste al RRL Java RMI 5

Architettura di RMI (fino a Java 1.2) Esiste un RMI Compiler che, a partire dall interfaccia del servizio, genera stub e skeleton, usati per la comunicazione remota Instaura un collegamento logico fra i due lati, serializza i parametri, codifica le richieste del client e le invia al server. L altro lato del RRL decodifica le richieste e le inoltra allo skeleton Java RMI 6

Architettura di RMI (fino a Java 1.2) Esiste un RMI Compiler che, a partire dall interfaccia del servizio, genera stub e skeleton, usati per la comunicazione remota È il livello applicativo della pila protocollare di Internet: collega fisicamente le due parti. I dati vengono semplicemente visti come sequenze di byte da inviare o ricevere Java RMI 7

Architettura di RMI (fino a Java 1.2) Esiste un RMI Compiler che, a partire dall interfaccia del servizio, genera stub e skeleton, usati per la comunicazione remota Trasforma le chiamate remote in chiamate locali e colleziona i valori di ritorno. I valori di ritorno sono inoltrati al RRL per tornare indietro al client. Dalla JDK 1.2 in poi, non fu più necessario creare Skeleton, lato Server, per invocazioni Java RMI remote. 8

Servizi di RMI / 1 RMI fornisce alcuni servizi base per la gestione delle applicazioni distribuite: 1. Naming/Registry service 1. Quando un processo server-side esporta un servizio basato su RMI deve registrare uno o più oggetti RMI su un Registry pubblico 2. Ciascun oggetto è registrato con un nome logico, usato dal client per ritrovarlo Il client può invocare il metodo public static Remote Naming.lookup(String name) della classe java.rmi.naming per ottenere uno handle ad un oggetto remoto, che implementa java.rmi.remote 3. Il riferimento viene convertito dal processo client in un riferimento stub che è restituito al chiamante Una volta ricevuto il riferimento il client può iniziare la conversazione con il server Java RMI 9

Servizi di RMI / 2 2. Il servizio di attivazione di un oggetto remoto Un server object è registrato ed in esecuzione all interno di una JVM attiva ed è sotto il controllo dello RMI Registry Se lo RMI Registry viene fermato, gli oggetti remoti vengono disattivati e i riferimenti diventano inutilizzabili Il Registry gestisce anche le richieste dei client di riferimenti remoti, restituendo opportuni handle Java RMI 10

Servizi di RMI / 3 3. Garbage Collector distribuito Per ogni oggetto remoto RMI, il reference layer mantiene la lista di riferimenti remoti registrati dai client per ogni oggetto attivato Questo possono essere il risultato di una lookup oppure ottenuti come valori di ritorno di un altro metodo su altri oggetti remoti Quando la VM di client si accorge che un oggetto remoto non è più referenziato localmente, invia una notifica al server RMI in modo tale che il server possa eliminare la lista dei riferimenti Quando un oggetto non è più referenziato da alcun client né da oggetti locali, viene eliminato attraverso un operazione di garbage collection Inoltre, il Garbage Collector prevede l uso di un timeout per l invocazione di un riferimento remoto Quando il timeout scade il riferimento viene eliminato dalla lista e viene data notifica ai client che avevano quel riferimento Java RMI 11

Uso di RMI Definire l interfaccia remota che definisce i metodi di business invocabili remotamente. L'interfaccia java.rmi.remote serve ad identificare le interfacce i cui metodi possono essere invocati da VM non locali. Ogni oggetto RMI deve direttamente o indirettamente implementare tale interfaccia Solo quei metodi specificati in una interfaccia che estende Remote possono essere invocati remotamente. Tutti i metodi dell'interfaccia remota devono dichiarare il lancio di java.rmi.remoteexception package it.uniroma1.dis.asos.rmi.server; import java.rmi.remote; import java.rmi.remoteexception; public interface Echo extends Remote { public String repeat(string phrase) throws RemoteException; } Java RMI 12

Uso di RMI (cont.) Compilare l'interfaccia remota cdc@cdc laptop:~/ /remoteinterface$ javac d bin sourcepath src./src/it/uniroma1/dis/asos/rmi/server/echo.java cdc@cdc laptop:~/ /remoteinterface$_ Java RMI 13

Uso di RMI (cont.) Creare lo stub (per rendere utilizzabile remotamente l oggetto RMI) Nota storica: Tutte le versioni di Java, dalla 1.5 in poi, non richiedono più la realizzazione di file bytecode specifici per gli stub» All'uopo, si possono usare direttamente i file.class delle interfacce dichiarate sul server» In precedenza, occorreva richiamare un comando shell (RMI Compiler, rmic) Si consiglia di creare un JAR contenente tutte le interfacce remote del servizio e renderlo disponibile su indirizzi pubblici così da renderlo replicabile sulle macchine dei client cdc@cdc laptop:~/ /remoteinterface$ jar cvf echo.jar C bin/. added manifest adding: compute.jar(in = 345) (out= 189)(deflated 45%) adding: it/(in = 0) (out= 0)(stored 0%) adding: it/uniroma1/(in = 0) (out= 0)(stored 0%) adding: it/uniroma1/dis/(in = 0) (out= 0)(stored 0%) adding: it/uniroma1/dis/asos/(in = 0) (out= 0)(stored 0%) adding: it/uniroma1/dis/asos/rmi/(in = 0) (out= 0)(stored 0%) adding: it/uniroma1/dis/asos/rmi/server/(in = 0) (out= 0)(stored 0%) adding: it/uniroma1/dis/asos/rmi/server/echo.class(in = 255) (out= 188)(deflated 26%) cdc@cdc laptop:~/ /remoteinterface$_ Java RMI 14

Uso di RMI (cont.) Definita l interfaccia remota, il passo successivo è implementarla e compilarla (dopo aver copiato nel percorso relativo il JAR contenente la definizione dell'interfaccia remota). package it.uniroma1.dis.asos.rmi.server; import java.rmi.remoteexception; public class EchoEngine implements Echo { @Override public String repeat(string phrase) throws RemoteException { return "\n\n\t\t\"i sound my barbaric " + phrase.trim().tolowercase() + " over the roofs of the world\"\n\n"; } } cdc@cdc laptop:~/ /server$ cp '/home/cdc/ /remoteinterface/echo.jar'./lib cdc@cdc laptop:~/ /server$ javac d bin sourcepath src classpath.:./lib/echo.jar./src/it/uniroma1/dis/asos/rmi/server/echoengine.java cdc@cdc laptop:~/ /server$_ Java RMI 15

Uso di RMI (cont.) In ogni momento è possibile avviare il servizio registry che associa (to bind) ad un nome logico un oggetto remoto. Da shell Unix/Linux con JDK installata, occorre eseguire: rmiregistry [<NumeroPorta>] NumeroPorta, parametro opzionale, identifica la porta in cui il registry accetta i bind e le lookup (le ricerche dai client). Default: 1099 Su macchine Windows: start rmiregistry [<NumeroPorta>] Il registry durante le lookup e le invocazioni remote deve avere accesso allo stub Si deve dunque 1) scrivere un programma che effettui il bind, registrando l oggetto RMI, 2) compilarlo 3) eseguirlo, una volta avviato il registry Java RMI 16

Uso di RMI (cont.) package it.uniroma1.dis.asos.rmi.server; import java.rmi.remoteexception; import java.rmi.registry.locateregistry; import java.rmi.registry.registry; import java.rmi.server.unicastremoteobject; import java.util.logging.logger; public class EchoServerApplication { public static final String BINDING_NAME = "Echo"; public static void main(string[] args) { EchoEngine engine = new EchoEngine(); try { Echo skeleton = } } (Echo) UnicastRemoteObject.exportObject(engine, 0); Registry registry = LocateRegistry.getRegistry(); registry.rebind(binding_name, skeleton); } catch (RemoteException e) { e.printstacktrace(); System.exit(1); } Logger.getLogger(BINDING_NAME).info( EchoEngine.class.getName() + " successfully bound to " + BINDING_NAME); Java RMI 17

Uso di RMI (cont.) cdc@cdc laptop:~/ /server$ javac d bin sourcepath src classpath.:./lib/echo.jar./src/it/uniroma1/dis/asos/rmi/server/echoserverapplication.java cdc@cdc laptop:~/ /server$ java classpath./bin:./lib/echo.jar Djava.rmi.server.codebase='file:/home/cdc/ /remoteinterface/echo.jar' it.uniroma1.dis.asos.rmi.server.echoserverapplication Apr 7, 2011 10:59:24 AM it.uniroma1.dis.asos.rmi.server.echoserverapplication main INFO: it.uniroma1.dis.asos.rmi.server.echoengine successfully bound to Echo _ Java RMI 18

RMI Name Registry Le operazioni di ricerca e registrazione accettano come parametro un URL il cui formato è: rmi://host:port/name rmi:// è il nome del protocollo ed è opzionale host: è il nome del server RMI (default localhost) port: è la porta su cui sta in ascolto il registry (default 1099) name: il nome logico (obbligatorio) Ad esempio un URL del tipo Echo è equivalente a rmi://localhost:1099/echo Java RMI 19

Il client package it.uniroma1.dis.asos.rmi.client; import it.uniroma1.dis.asos.rmi.server.echo; import java.rmi.registry.locateregistry; import java.rmi.registry.registry; public class VoiceForTheEcho { public static void main(string[] args) { if (args.length < 1) { System.err.println("I needed something to hear..."); System.exit(1); } } } String name = "Echo"; try { Registry registry = LocateRegistry.getRegistry(); Echo echoengine = (Echo) registry.lookup(name); System.out.println(echoEngine.repeat(args[0])); } catch (Exception e) { System.err.println( "Sadly, your voice did not flow beyond the walls"); e.printstacktrace(); } Java RMI 20

Il client cdc@cdc laptop:~/ /client$ cp '/home/cdc/ /remoteinterface/echo.jar'./lib cdc@cdc laptop:~/ /client$ javac d bin sourcepath src classpath.:./lib/echo.jar./src/it/uniroma1/dis/asos/rmi/client/voicefortheecho.java cdc@cdc laptop:~/ /client$ java classpath./bin:./lib/echo.jar Djava.rmi.server.codebase='file:/home/cdc/ /remoteinterface/echo.jar' it.uniroma1.dis.asos.rmi.server.easy.voicefortheecho I needed something to hear... cdc@cdc laptop:~/ /client$ java classpath./bin:./lib/echo.jar Djava.rmi.server.codebase='file:/home/cdc/ /remoteinterface/echo.jar' it.uniroma1.dis.asos.rmi.server.easy.voicefortheecho yawp "I sound my barbaric yawp over the roofs of the world" _ Java RMI 21

Serializzazione Il meccanismo base utilizzato da RMI per la trasmissione dei dati fra client e server è quello della serializzazione (serialization) L obiettivo principale della serializzazione è permettere la codifica di oggetti e strutture in sequenze di byte Tali sequenze poi vengono trasferite all opposto end-point dove vengono deserializzate per ricostruire una copia dell oggetto remoto È necessario che entrambi gli end-point abbiano la stessa definizione della classe Entrambi, cioè, abbiano il.class relativo Gli oggetti di una certa classe Java sono considerati serializzabili se la classe implementa l interfaccia java.io.serializable ed eventuali oggetti incapsulati sono a loro volta serializzabili L interfaccia Serializable è puramente dichiarativa, ovverosia non definisce alcun metodo Java RMI 22

Ulteriori informazioni Un'utile guida introduttiva http://download.oracle.com/javase/tutorial/rmi/overview.html Documentazione: http://download.oracle.com/javase/6/docs/api/java/rmi/package-summary.html Java RMI 23