RMI. Java RMI RMI. G. Prencipe prencipe@di.unipi.it

Похожие документы
Socket & RMI Ingegneria del Software - San Pietro

RMI Remote Method Invocation

Programmazione di sistemi distribuiti

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

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

Programmazione distribuita

Introduzione a Java Remote Method Invocation (RMI)

Java Remote Method Invocation

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

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:

Remote Method Invocation (RMI)

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

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

RMI: metodi equals e hashcode

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Esercitazione di Sistemi Distribuiti: Java RMI

Client - Server. Client Web: il BROWSER

Ingegneria del Software. Presentazione del pattern Proxy

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Java: Compilatore e Interprete

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

Telematica II 17. Esercitazione/Laboratorio 6

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

RMI. Prova pratica di Sistemi Distribuiti:

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

Programmazione a Oggetti Lezione 10. Ereditarieta

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

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

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

Parte II: Reti di calcolatori Lezione 10

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

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Lezione n.10 LPR- Informatica Applicata RMI CallBacks

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione

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

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Main System Monitor Keyboard

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

19. Introduzione al multi-threading

Java RMI (Remote Method Invocation)

Registratori di Cassa

Corso di Informatica Modulo T3 B2 - Database in rete

Approccio stratificato

appunti delle lezioni Architetture client/server: applicazioni client

Esercitazione n 4. Obiettivi

Test di unità con JUnit4

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

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

GESTIONE DEI PROCESSI

Programmazione di rete in Java

Soluzione dell esercizio del 2 Febbraio 2004

13. Chain of Responsibility

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

Progettazione : Design Pattern Creazionali

1 JSPDynPage, componenti portale e Java Server Pages

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Sistemi Operativi (modulo di Informatica II)

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

Il Pattern PROXY. Ex presentazione realizzata dallo studente Paolo Melchiori (matricola 65734) nell a.a

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

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Algoritmi di Ricerca. Esempi di programmi Java

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Client e Server comunicano tramite il protocollo SOAP.

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Prova d Esame Compito A

Corso sul linguaggio Java

Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

19. LA PROGRAMMAZIONE LATO SERVER

20 - Input/Output su File

Realizzazione di una classe con un associazione

Esercizi della lezione 5 di Java

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

appunti delle lezioni Architetture client/server: applicazioni server

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

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Oggetti Lezione 3. aspetti generali e definizione di classi I

I casi d uso corrispondono ai compiti che l attore (che può essere una persona fisica e non) può svolgere.

SITI-Reports. Progetto SITI. Manuale Utente. SITI-Reports. ABACO S.r.l.

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

Guida all uso di Java Diagrammi ER

Corso di Informatica

Comunicazione fra oggetti distribuiti

Транскрипт:

Java Remote Method Invocation -- RMI G. Prencipe prencipe@di.unipi.it RMI RMI è una tecnologia JAVA che permette a una JVM di comunicare con un altra JVM per farle eseguire metodi È possibile che oggetti invochino metodi su altri oggetti remoti come se questi ultimi fossero locali L oggetto remoto può a sua volta restituire il risultato della computazione, inviandolo al richiedente RMI Ogni servizio RMI è definito da un interfaccia che descrive i metodi che possono essere eseguiti in remoto Questa interfaccia deve essere condivisa da tutti gli sviluppatori che scriveranno software per quel servizio Può essere creata più di una implementazione dell interfaccia, e gli sviluppatori non devono necessariamente conoscere quale implementazione è utilizzata o dove essa sia localizzata RMI I sistemi che utilizzano RMI per comunicare sono tipicamente divisi in client e server Il server fornisce un servizio RMI, e un cliente invoca un metodo di quel servizio I server RMI devono registrarsi (presso un lookup service) per permettere i clienti di poterli trovare In alternativa possono rendere disponibile un riferimento al servizio in altri modi 1

RMI Inclusa come parte della piattaforma JAVA c è un applicazione chiamata rmiregistry È un processo separato che permette alle applicazioni di registrare servizi RMI o di ottenere un riferimento a un certo servizio Ad ogni registrazione è associato un nome (rappresentato come una Stringa), che viene utilizzato dai clienti per selezionare il servizio appropriato Se un servizio si sposta da un server a un altro, il cliente deve solo cercare nel registro per conoscere la nuova locazione RMI Una volta che un servizio è registrato, esso attende per richieste provenienti dai clienti I clienti inviano messaggi RMI per invocare metodi di oggetti remoti Il cliente, prima di poter effettuare l invocazione, deve ottenere un riferimento all oggetto remoto Esso viene tipicamente ottenuto cercando il servizio nel registro L applicazione cliente richiede il nome di una particolare applicazione, e riceve una URL alla risorsa remota RMI Il seguente formato di URL è utilizzato per rappresentare un riferimento a un oggetto remoto rmi://hostname:port/servicename Una volta ottenuto il riferimento, il cliente può interagire con il servizio remoto I dettagli della rete legati alla comunicazione sono completamente trasparenti allo sviluppatore dell applicazione Si utilizzano gli oggetti remoti come se fossero locali Questo si ottiene grazie alla divisione del sistema RMI in due parti: stub e skeleton stub L oggetto stub agisce dal lato cliente, e ha il compito di convogliare le richieste al server RMI remoto Funziona un po come un proxy Ogni servizio RMI è definito come un interfaccia, non come un implementazione L oggetto stub implementa una particolare interfaccia RMI, che l applicazione cliente può usare come ogni altra implementazione di oggetti 2

stub Lo stub, però, invece che fare il lavoro da solo, passa il messaggio (richiesta) al servizio RMI remoto, attende la risposta, e la restituisce al metodo invocante Lo sviluppatore dell applicazione non ha bisogno di conoscere dove si trova la risorsa RMI, su quale piattaforma gira, o come essa risponderà Il cliente RMI semplicemente invoca un metodo dell oggetto stub; esso gestisce tutti i dettagli dell implementazione skeleton Lo skeleton è la controparte dello stub sul server È responsabile di ricevere le richieste RMI, e di passarle al servizio RMI Lo skeleton non fornisce un implementazione di un servizio RMI Funge solo da ricevitore di richieste Lo skeleton invoca l implementazione dell interfaccia associata al servizio RMI e invia la risposta allo stub nel cliente Comunicazione La comunicazione (scambio dei messaggi) avviene tra lo stub e lo skeleton utilizzando socket TCP Lo skeleton, una volta creato, si pone in ascolto di richieste provenienti dallo stub I parametri che possono essere scambiati in un sistema RMI non si limitano a tipi primitivi Ogni oggetto che è serializzabile (serializable) può essere inviato come parametro o restituito da un metodo remoto Quando lo stub invia una richiesta, deve impacchettare i parametri: data marshalling Lo skeleton ricostruisce i parametri: data unmarshalling Serializzazione La serializzazione degli oggetti permette di prendere un oggetto che implementa l interfaccia Serializable e trasformarlo in una sequenza di bytes Crea un immagine dell oggetto Successivamente è possibile prendere questa sequenza e ricomporla per rigenerare l oggetto di partenza 3

Serializzazione Serializzazione È molto semplice serializzare un oggetto: è sufficiente implementare Serializable (che non ha metodi!!) Per utilizzare la serializzazione bisogna Creare un oggetto OutputStream e racchiuderlo in un oggetto ObjectOutputStream oos A questo punto si chiama oos.writeobject(object o) e l oggetto o è serializzato e inviato all OutputStream Simile per la lettura (ObjectInputStream e readobject) Chiaramente in lettura si ottiene un riferimento a Object Nella serializzazione di un oggetto vengono salvati i campi non-statici e non-transienti (vedremo dopo) dell oggetto Inoltre quando si serializza un oggetto vengono salvati anche i suoi riferimenti ad altri oggetti (purchè implementino a loro volta Serializable) L interfaccia di un servizio RMI Ogni sistema che utilizza RMI deve definire un interfaccia L interfaccia definisce i metodi che possono essere invocati in remoto Specifica anche parametri, tipi di ritorno, e eccezioni Stub, skeleton, e il servizio RMI implementano quest interfaccia L interfaccia di un servizio RMI Tutte le interfacce di un servizio RMI estendono l interfaccia java.rmi.remote Solo i metodi definiti in una interfaccia java.rmi.remote possono essere invocati in remoto Gli altri metodi sono nascosti ai clienti RMI 4

Implementare un servizio RMI public interface RMILightBulb extends java.rmi.remote { public void on () throws java.rmi.remoteexception; public void off() throws java.rmi.remoteexception; public boolean ison() throws java.rmi.remoteexception; Una volta che l interfaccia di un servizio è definita, bisogna implementarla Questa implementazione fornisce le funzionalità per ognuno dei metodi definit Può introdurre anche metodi aggiuntivi, che non aranno però accessibili in remoto Gli unici accessibili in remoto sono infatti i metodi definiti nell interfaccia public class RMILightBulbImpl extends java.rmi.server.unicastremoteobject implements RMILightBulb { // Definizione del costruttore public RMILightBulbImpl() throws java.rmi.remoteexception { // Valore di default setbulb(false); // Boolean flag: conserva lo stato della lampadina private boolean lighton; // Metodo accessibile in remoto public void on() throws java.rmi.remoteexception { setbulb (true); // Metodo accessibile in remoto public void off() throws java.rmi.remoteexception { setbulb (false); 5

Creare stub e skeleton // Metodo accessibile in remoto public boolean ison() throws java.rmi.remoteexception {return getbulb(); // Metodo locale public void setbulb (boolean value) {lighton = value; // Metodo locale public boolean getbulb () {return lighton; Le classi stub e skeleton sono responsabili di inoltrare e processare le richieste RMI Gli sviluppatori non dovrebbero scrivere direttamente queste classi Una volta che l implementazione del servizio è scritta, il tool rmic (distribuito con la JDK), dovrebbe essere usato per creare stub e skeleton Creare stub e skeleton Creare un server RMI Una volta compilate l implementazione e l interfaccia, si esegue rmic implementation Dove implementation è il nome della classe relativa all implementazione Nel nostro esempio rmic RMILightBulbImpl Vengono generati due file: RMILightBulbImpl_Stub.class e RMILightBulbImpl_Skeleton.class Lo stub deve essere distribuito a tutit i clienti Il server RMI è responsabile della creazione di un istanza di una implementazione del servizio, e successivamente della sua registrazione presso il registro (rmiregistry) Semplice da fare con poche linee di codice Vediamo 6

import java.rmi.*; import java.rmi.server.*; public class LightBulbServer { public static void main(string args[]){ System.out.println ("Loading RMI service"); try{ // Crea un istanza del servizio // e ottiene un riferimento RMILightBulbImpl bulbservice = new RMILightBulbImpl(); //Stampa l esatta localizzazione del servizio //Ogni servizio è legato a una porta TCP, e il rif. //è composto da un hostname e una porta RemoteRef location = bulbservice.getref(); System.out.println (location.remotetostring()); //Il passo successivo è di registrare il servizio //1. Controlla se un registro è stato specificato //Il default è su localhost String registry = "localhost"; if (args.length >=1){registry = args[0]; //Formato registrazione //registry_hostname (opzionale):port /service String registration = "rmi://" + registry + "/RMILightBulb"; //2. Effettua la registrazione in modo tale che i clienti // possano trovare il servizio // Si utilizzano i metodi statici della classe java.rmi.naming, responsabili per recuperare e piazzare riferimenti remoti a oggetti nel registro Naming.rebind(registration, bulbservice ); // Cattura delle eccezioni catch (RemoteException re){ System.err.println ("Remote Error - " + re); catch (Exception e){ System.err.println ("Error - " + e); 7

Creare un cliente RMI Anche la scrittura di un cliente non è complicata Il cliente necessita solo di ottenere un riferimento all interfaccia remota, e non deve sapere come i messaggi sono scambiati, o l effettiva locazione del servizio Per trovare il servizio inizialmente, viene effettuata una ricerca nel registro RMI Successivamente, il cliente può invocare i metodi remoti dell interfaccia del servizio come se fossero invocati su un oggetto locale Vediamo import java.rmi.*; public class LightBulbClient { public static void main(string args[]){ System.out.println ("Looking for light bulb service"); try { // Controlla se un registro è stato specificato String registry = "localhost"; if (args.length >=1){ registry = args[0]; String registration = "rmi://" + registry + "/RMILightBulb"; // Cerca il servizio nel registro Remote remoteservice = Naming.lookup (registration); // Cast alla interfaccia RMILightBulb // Se non viene trovata l interfaccia specificata // viene lanciata una NotBoundException RMILightBulb bulbservice = (RMILightBulb) remoteservice; // Accende System.out.println ("Invoking bulbservice.on()"); bulbservice.on(); // Controlla lo stato System.out.println ("Bulb state : " + bulbservice.ison() ); // Spegne System.out.println ("Invoking bulbservice.off()"); bulbservice.off(); System.out.println ("Bulb state : " + bulbservice.ison() ); 8

// Gestione delle eccezioni catch (NotBoundException nbe){ System.out.println ("No light bulb service available in registry!"); catch (RemoteException re){ System.out.println ("RMI Error - " + re); catch (Exception e){ System.out.println ("Error - " + e); Lanciare il sistema RMI Lanciare un sistema RMI ha bisogno di alcune attenzioni, e bisogna seguire un ordine preciso nel lanciare le applicazioni Prima che il cliente possa invocare metodi, il registro deve essere in esecuzione Nemmeno il servizio può essere lanciato prima che il registro sia in esecuzione, altrimenti viene lanciata un eccezione al momento della registrazione Lo stub deve essere fornito ai clienti Lanciare il sistema RMI 1. Copiare tutti i file necessari sulle macchine dei clienti e del server (stub e skeleton) 2. Eseguire rmiregistry 3. Eseguire il server Java Remote Method Invocation -- RMI 4. Eseguire i clienti fine 9

Problemi Un problema tipico con i servizio RMI è legato alla distribuzione dello stub ai clienti Può risultare semplice se si conosce la localizzazione die clienti Altrimenti non è semplice Questi problemi vengono risolti utilizzando la tecnica del dynamic class loading 10