RMI. Remote Method Invocation. Enrico Tassi, 3/4/2009. Slides originali di Nicola Gessa

Documenti analoghi
Remote Method Invocation

Esercitazione di Sistemi Distribuiti

LPR 2005/2006 Lezione 7. paradigma di interazione domanda/risposta remote procedure call RMI (Remote Method Invocation): API JAVA esercizio

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

PROVA FINALE Ingegneria del software

Organizzazione della lezione. Lezione 14 Remote Method Invocation - 2. Remote. Il diagramma di RemoteHello

Programmazione distribuita

Oggetti Distribuiti e Java RMI

Corso di Reti di Calcolatori T

Corso di Reti di Calcolatori LA

Esercizi RMI. Laboratorio di Programmazione di Rete A 5/12/2007. Esercitazione di Laboratorio

Organizzazione della lezione. Lezione 13. Applicazioni ad oggetti distribuite. Remote Method Invocation (RMI)

16. Java Remote Method Invocation (4)

Esercitazione di Sistemi Distribuiti: Java RMI

Organizzazione della lezione. Lezione 16 Remote Method Invocation - 4. Modello Client Server. Le classi di Archivio Client-Server

Organizzazione della lezione. 16. Java Remote Method Invocation (4) Le classi ed interfacce di RMI. Persistenza. Oggetti attivabili

Socket & RMI Ingegneria del Software - San Pietro

Esercizi su Java RMI. Progetto di Cliente / Servitore e supporto. Possibile tabella mantenuta dal server

Organizzazione della lezione. Lezione 17 Remote Method Invocation - 5. Remote. Le classi ed interfacce di RMI. Persistenza. Oggetti attivabili

RMI. Java RMI RMI. G. Prencipe

Esercizi su Callback RMI

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

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

Java Remote Method Invocation

ASD: Sistemi Distribuiti (Prof. Scarano) 20/05/2002

15. Java Remote Method Invocation (3)

12. Java: Remote Method Invocation (3)

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

LA PROGRAMMAZIONE RMI

RMI: metodi equals e hashcode

Compute engine generici in RMI

Lezione n.10 LPR. RMI CallBacks

Corso di Reti di Calcolatori L-A

Architetture distribuite Alcuni esempi: Alcuni commenti sul ruolo del registry. Import Interfaccia remota Due metodi remoti

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

Introduzione a Java Remote Method Invocation (RMI)

Agenti Mobili in Java RMI

14. Java Remote Method Invocation (2)

Applicazioni distribuite e sistemi ad oggetti distribuiti. RPC RMI - Web Services 1

Applicazioni distribuite e sistemi ad oggetti distribuiti

SCD. Sistemi distribuiti: il modello Java RMI. UniPD - SCD 2011/12 - Sistemi Concorrenti e Distribuiti 1. Architettura del modello 1

JAVA - I/O System. Il JAVA considera tutte i flussi da e verso l esterno, come stream di byte. Questi possono essere di ingresso o di uscita:

Organizzazione della lezione. Invocazione remota di metodi fai-da-te. Lezione 12 Introduzione a Remote Method Invocation

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

RMI remote method invocation

Programmazione in Java e gestione della grafica (I modulo) Lezione 2: Prime nozioni di Java

Organizzazione della lezione. Organizzazione della lezione. 14. Java Remote Method Invocation (2) La sicurezza in Java

Corso di Reti di Calcolatori T

SCD. Il modello Java RMI. Sistemi distribuiti: il modello Java RMI. Architettura del modello 2. Architettura del modello 3. Architettura del modello 1

Serializzazione Java. Serializzazione. Complicazioni 1/2. Complicazioni 2/2. Calendario esercitazioni e laboratori. Applicazioni della Serializzazione

Java RMI. Alcune premesse Interfaccia e Implementazione RMI. Architettura. Esempi interfaccia e implementazione

MinMax a Java Distributed Application SISTEMI DISTRIBUITI Fabrizio G. Ventola

Remote Method Invocation (RMI)

Serializzazione Java. Serializzazione. Calendario esercitazioni e laboratori. Applicazioni della Serializzazione

Programmazione di sistemi distribuiti

Lezione n.9. RMI: Remote Method Invocation 1/12/2009 Andrea Corradini

domenica 9 giugno 13 Serializzazione

Organizzazione della lezione. Modelli di programmazione: RPC e RMI Trasparenza: un dibattito Un esempio di implementazione di invocazione remota

Laurea in Informatica. "Programmazione Distribuita" - Prof. Scarano. A.A Università di Salerno 1. Organizzazione della lezione

Java RMI (Remote Method Invocation)

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

RMI Remote Method Invocation

SCD. Il modello Java RMI. Sistemi distribuiti: il modello Java RMI. Architettura del modello 2. Architettura del modello 3. Architettura del modello 1

SCD. Il modello Java RMI. Sistemi distribuiti: il modello Java RMI. Architettura del modello 2. Architettura del modello 1. Architettura del modello 3

10. Invocazione di Metodi Remoti

Il problema nasce dalla caratteristica di Java di essere distribuito

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Lezione n.10 LPR Informatica Applicata RMI Approfondimenti Callback. 15/05/2012 Laura Ricci

Programmazione I - corso B a.a prof. Viviana Bono

Firewall. RMI e Firewall

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Corso sul linguaggio Java

Multithreading in Java I parte. Lorenzo Gallucci

Sicurezza in Java. Evoluzione dei modelli di sicurezza in Java Architettura di autorizzazione nel JDK 1.2

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI

Corso di Reti di Calcolatori T

Il linguaggio Java. Oggetto remoto. Remote Method Invocation (RMI) Oggetto remoto: oggetto i cui metodi possono essere invocati attraverso la rete

Classi ed Oggetti. Fondamenti di Informatica A-K

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

TECN.PROG.SIST.INF. I Socket Roberta Gerboni

Architettura. Java RMI (Remote Method Invocation) Definizioni e generalità

Corso di Reti di Calcolatori T

Servizi RMI hot-swap.

Programmazione di rete in Java

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Compute engine generici in RMI

Struttura dei Sistemi Operativi

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Organizzazione della lezione. 18. Applicazioni ed Esempi (2) II prova intercorso. Prove scritte degli esami successivi

Corso di Reti di Calcolatori M

Obiettivo della lezione. Presentare Java 2 Enterprise Edition (J2EE) Presentare due tecnologie Java connesse ad Enterprise Java Beans

Programmazione a Oggetti Lezione 11. Eccezioni e Packages

Il linguaggio Java. Remote Method Invocation (RMI)

Corso di Reti di Calcolatori L-A

Lezione n.8. RMI: Remote Method Invocation. 1/12/2009 Vincenzo Gervasi

RMI. Introduzione DI GIOVANNI PULITI

Transcript:

RMI Remote Method Invocation Enrico Tassi, 3/4/2009 Slides originali di Nicola Gessa

Remote Method Invocation Si colloca del mondo della programmazione distribuita. L obiettivo è di fornire al programmatore un'astrazione sulla collocazione (in rete) degli oggetti che il suo programma utilizza. Metodi appartenenti a oggetti remoti vengono eseguiti dal calcolatore remoto in modo trasparente. Si definisce client il programma chiamante che ottiene riferimento all oggetto remoto, server il programma che crea gli oggetti remoti. Tali applicazioni sono anche denominate distributed object application

Quali vantaggi? Semplicità nella gestione delle risorse distribuite (possibile) Miglioramento delle prestazione complessive Es: suddivisione di una computazione pesante in sottoprocedure più piccole, eseguite tutte su macchine diverse, possibilmente in parallelo, diminuendo in tal modo il tempo complessivo di esecuzione.

Sistema distribuito.. quindi è necessario un meccanismo di comunicazione Abbiamo visto i socket nella precedente lezione, ma tale tecnologia non è sufficiente: non definisce le modalità di invocazione di metodi non definisce protocolli per lo scambio di informazioni

Caratteristiche di RMI Utilizzando la tecnologia RMI di Java è possibile per un oggetto in esecuzione su una JVM di richiedere l esecuzione di un metodo di un oggetto in esecuzione su un altra JVM. RMI richiede l utilizzo esclusivo di Java come linguaggio di sviluppo: difficile integrazione con altri linguaggi Semplicità e velocità nello sviluppo Dynamic Code Loading

Architetture di RMI La struttura di un applicazione RMI è organizzata in strati orizzontali sovrapposti RMI Client JVM RMI Server Simulazione locale sul client Stubs Skeleton Oggetto reale eseguito sul server Remote Reference Layer Transport Layer Connessione virtuale Connessione fisica Remote Reference Layer Transport Layer

Architetture di RMI Lo strato più alto è costituito da applicazioni (client e server) eseguite dalla Java Virtual Machine Lo stub e lo skeleton forniscono la rappresentazione dell oggetto remoto: lo stub gestisce la simulazione locale sul client e agendo come proxy consente la comunicazione con l oggetto remoto, lo skeleton ne consente l esecuzione sul server Il client esegue i metodi dell oggetto remoto in modo del tutto analogo alla chiamata locale: ris = OggettoRemoto.nomeMetodo(par1, par2,..) senza preoccuparsi dei dettagli della comunicazione Il client ha solo in minima parte la sensazione di usare un oggetto remoto

Passaggio di parametri Percorso dei parametri Serializzati dalla Virtual Machine Inviati sotto forma di stream al server Deserializzati dal server che li utilizza all interno del corpo del metodo invocato Il risultato segue il percorso inverso fino ad arrivare al client

La serializzazione Il meccanismo alla base utilizzato da RMI per la trasmissione dei dati fra client e server è quello della serializzazione che permette il flusso di dati complessi all interno di stream (può venir usata indipendentemente da applicazioni RMI) La serializzazione consiste nella trasformazione automatica di oggetti e strutture in sequenze di byte manipolabili con le classi della famiglia Stream del package java.io Gli stream sono associabili sia a socket che a file es: Record record = new Record() ObjectOutputStream oos = new ObjectOutputStream(myos) oos.writeobject(record);

La serializzazione Un oggetto è serializzabile se implementa l interfaccia Serializable Es: public class Record implements Serializable{ private String Nome; public Record(String Nome){ this.nome = Nome } }

La serializzazione La serializzazione è ricorsiva (un oggetto serializzabile deve contenere oggetti serializzabili) La maggior parte delle classi del JDK è serializzabile (eccetto alcune che adottano strutture dati binarie dipendenti dalla piattaforma)

La serializzazione - UID La serializzazione richiede che ogni classe abbia un ID univoco Tool serialver per calcolarlo Utilizzato per controllare che un oggetto deserializzato appartenga alla classe corretta private static final long serialversionuid = 1234567890L;

Gli strati RRL e TL Si occupano della gestione a basso livello ( all interno dell architettura RMI) della comunicazione Il Remote Reference Layer (RRL) ha il compito di instaurare un connessione virtuale fra il client e il server ( esegue operazioni di codifica e decodifica dei dati). Questo adotta un protocollo generico e indipendente dal tipo di stub o skeleton utilizzato Il Transport Layer esegue la connessione vera e propria tra le macchine utilizzando le funzionalità standard di networking di Java, ovvero i socket (protocollo TCP/IP)

Il Transport Layer Il TL è responsabile del controllo dello stato delle vari connessioni I dati vengono visti come sequenze di byte da inviare o da leggere IL TL si incarica di localizzare il server RMI relativo all oggetto remoto richiesto Esegue la connessione per mezzo di un socket

Programmare con RMI Le classi e i metodi sono contenuti nei package java.rmi e java.rmi.server Si definisce oggetto remoto un oggetto che implementi l interfaccia Remote i cui metodi possono essere eseguiti da un'applicazione client posta su un'altra macchina virtuale Un oggetto diventa remoto se implementa un interfaccia remota, ossia un interfaccia che estende l interfaccia java.rmi.remote

Le classi di oggetti remoti Una classe può implementare un numero a piacere di interfacce remote. Una classe può estendere una classe che implementa una interfaccia remota. Una classe può definire anche dei metodi che non fanno parte delle interfacce remote e che pertanto sono invocabili solo in locale La classe deve supportare accessi concorrenti perché più client potrebbero usarla contemporaneamente. (Bisogna usare metodi/blocchi synchronized dove serve)

Client e server in RMI? Sia il client che il server di una applicazione possono allocare degli oggetti remoti ed esportarli con un nome sul registry oppure possono passarli come parametri di altri oggetti remoti. Dal punto di vista del singolo oggetto remoto il server è chi lo alloca e lo esporta mentre il client è chi richiede un riferimento ad un oggetto remoto. In definitiva quindi con RMI tutte le parti di una applicazione distribuita possono agire sia come client che come server.

Come trasformare un oggetto in un oggetto remoto? Oggetto classico public class MyServer{ public String concat(string a, String b){ return a+b; }} public interface MyServerInterface extend Remote{ public String concat (String a, String b)throws RemoteException; } public class MyServerImpl implements MyServerInterface } Corrispettiva implementazione remota extends UnicastRemoteObject{ public MyServerImpl() throws RemoteException{} public String concat(string a, String b)throws RemoteException{ return a+b;}

Hello World con RMI Scrivere l interfaccia dell oggetto remoto : HelloRemoteInterface Scrivere il client che richiede l accesso all oggetto remoto : Client Scrivere una classe HelloImpl che implementa HelloRemoteInterface e estende UnicastRemoteObject Scrivere il server che rende accessibile un oggetto della classe HelloRemoteInterface

Hello World con RMI - l interfaccia L interfaccia remota deve dichiarare tutti i metodi che si vuole poter richiamare in maniera remota deve essere dichiarata public deve estendere l interfaccia java.rmi.remote ogni metodo deve dichiarare java.rmi.remoteexception nella sezione throws per proteggere l applicazione da anomalie derivanti dall utilizzo di risorse remote import java.rmi.remote; import java.rmi.remoteexception; public interface HelloRemoteInterface extends Remote{ } String sayhello() throws RemoteException;

Implementare l interfaccia remota public class HelloImpl extends UnicastRemoteObject implements Hello{ dichiara che implementa l intefaccia Hello ( con tutti i sui metodi) estende la classe UnicastRemoteObject per consentire la creazione di un oggetto remoto che adotta i protocolli di comunicazione di default di RMI basata sui socket e TCP rimane costantemente attivo

Definire i costruttori public HelloImpl()throws RemoteException{ super(); } il metodo super() chiama il costruttore della classe UnicastRemoteObject che esegue le inizializzazioni necessarie per consentire di rimanere in attesa (listen) di richieste remote su una porta e poterle gestire (accept) potrebbe generare l eccezione RemoteException se la connessione non fosse possibile

Implementazione dei metodi remoti public String sayhello(){ return "Hello World"; } devono essere implementati tutti i metodi dell interfaccia gli argomenti dei metodi e i risultati restituiti devono essere oggetti serializzabili

Esportazione dell oggetto remoto Creare e installare il security manager Creare una o più istanza della classe che implementa l'interfaccia remota Identificare e registrare tali oggetti con un nome nel rmiregistry Deve essere in esecuzione l'utility rmiregistry!

Il security manager Chi garantisce che il codice scaricato da remoto non esegua operazioni pericolose? if(system.getsecuritymanager() == null){ System.setSecurityManager(new RMISecurityManager()); } Il metodo main deve creare e installare un security manager, che può essere il RMISecurityManager o definito facendone una sottoclasse Il S.M. garantisce che le classi che vengono caricate non eseguano operazioni per le quali non siano abilitate se il S.M non è specificato non è permesso nessun caricamento di classi da parte sia del client ( stub ) che del server

Security manager La possibilità di scaricare codice è controllata e regolata da un security manager che opera in accordo ad una policy Il client e il server devono essere eseguiti con una policy adeguata alle loro esigenze e alle esigenze di sicurezza del sistema specificando il parametro Djava.security.policy=java.policy al momento del lancio dell esecuzione. java.policy è il nome del file dove viene specificata la politica di sicurezza.

I file java.policy Esempi di tali file possono essere: grant { permission java.security.allpermission; }; grant { permission java.net.socketpermission *:1024-65535, connect,accept ; permission java.net.socketpermission *:80, connect ; };

Istanziare gli oggetti remoti HelloImpl obj = new HelloImpl(); Nel metodo main si devono creare una o più istanze dell oggetto che fornisce il servizio Una volta creato, l oggetto è pronto per accettare richieste remote

Registrare l oggetto remoto registry.rebind("//esempio/helloserver",obj); Il client deve poter ottenere un riferimento all oggetto remoto: RMI fornisce un registry degli oggetti per creare un associazione (bind) fra un nome URL-formatted e un oggetto l RMI registry è un name-service che consente ai client di ottenere riferimenti agli oggetti: una volta registrato l oggetto i client possono farne richiesta attraverso il nome e invocarne i metodi nessun protocollo deve essere specificato nel primo argomento la porta di default su cui risponde il RMIregistry è la 1099, ma può essere cambiata

Registrare l oggetto remoto Un'applicazione puo creare un associazione solo sul RMIregistry del host locale I client possono invece eseguire la propria ricerca di oggetti su qualunque host L operazione di registrazione può generare varie eccezioni AlreadyBoundException, se il nome logico è gia utilizzato MalformedURLException, per errori nella sintassi dell URL RemoteException negli altri casi

Fare la scansione di un registry RMI import java.rmi.registry.locateregistry; import java.rmi.registry.registry; import java.rmi.remoteexception; public class LsRegistry { static void ls(string host) throws RemoteException { Registry registry = LocateRegistry.getRegistry(host); System.out.println( "Names bound in registry at "+host+":"); for(int i=0; i<registry.list().length; i++){ System.out.println(registry.list()[i]); } } }

Un client per richiamare gli oggetti remoti Deve ottenere un riferimento all oggetto remoto che vuole richiamare dal RMIRegistry eseguito sul server, utilizzando un istanza dello stub a cui passare hostname ( ed eventualmente porta) e nome dell oggetto obj= (Hello)registry.lookup("//esempio/HelloServer"); Richiama i metodi dell oggetto secondo la sintassi solita message = obj.sayhello();

Compilazione ed esecuzione Compilare i file.java con javac per creare i file.class Generare stub e skeleton col comando rmic sul file che contiene l implementazione dell oggetto remoto (HelloImpl.class) questo genera i file HelloImpl_Stub.class e HelloImpl_Skel.class (Non più necessario da java 5, ma per dialogare con JVM precedenti serve ancora) Lanciare in background sul server l RMIregistry col comando rmiregistry &. Questo utilizza per default la porta 1099; per utilizzarne un altra specificarla come parametro (es. rmiregistry 2001 &). Ogni volta che viene modificata un interfaccia remota deve essere rieseguito Lanciare il server Lanciare il client

Demo Sorgenti nella directory esempi/hello/

Esempio sulla concorrenza:l oggetto remoto Creiamo un interfaccia remota che consenta di incrementare un valore è proviamo a chiamarla da client diversi. Cosa succede? Se vogliamo proteggere parti di codice dei metodi degli oggetti remoti da accessi concorrenti pericolosi dobbiamo definire questo codice all interno di blocchi synchronized

Esempio sulla concorrenza:l oggetto remoto package ValNumero; import java.rmi.remote; import java.rmi.remoteexception; public interface newvalnumero extends Remote{ int getvalore() throws RemoteException; int setvalore(int i) throws RemoteException; int incvalore() throws RemoteException; } synchronized public int incvalore() { int j; //val++; funziona senza gestire la concorrenza con synchronized! j=this.getvalore(); this.setvalore(j+1); return j+1; }

Esempio:Implementare un Compute server Un compute server è un oggetto remoto che consente ad un server di ricevere dei task dai client, eseguirli e restituire il risultato. Il task viene definito dal client ma viene eseguito sulla macchina del server. Il task può variare indipendentemente dal server, l importante è che rispetti una determinata interfaccia Il compute server scarica dal client il codice del task e lo esegue all interno della propria Java virtual machine

Interfacce utilizzate Per implementare un compute server servono due interfacce L interfaccia Compute, che consenta ai client di inviare task al compute server L interfaccia Task, che consenta al compute server di eseguire i task

package compute; Interfaccia Compute import java.rmi.remote; import java.rmi.remoteexception; public interface Compute extends Remote { Object executetask(task t) throws RemoteException; } Questa interfaccia definisce i metodi che possono essere chiamati da altre virtual machine. Gli oggetti che implementano questa interfaccia diventano oggetti remoti.

package compute; Interfaccia Task import java.io.serializable; public interface Task extends Serializable { Object execute(); } Questa interfaccia è usata come argomento nel metodo executetask dell interfaccia Compute (definito precedentemente) e fornisce al Compute Server il meccanismo per eseguire il task. Non è un interfaccia remota, quindi non è associata ad oggetti remoti. Il metodo execute deve essere presente in ogni implementazione di questa interfaccia.

Implementazione del Compute Server //oggetto remoto per l esecuzione dei task import java.rmi.*; import java.rmi.server.*; import compute.*; public class Server extends UnicastRemoteObject implements Compute { public Server() throws RemoteException { super(); } public Object executetask(task t) { return t.execute(); } }

Demo Sorgenti nella directory esempi/task/

Riassunto degli elementi necessari Due interfacce : Compute.java Task.java Il server che implementa l interfaccia compute e comprende il metodo main per l esecuzione: Server.java L implementazione del task da far eseguire: MyTask.java Il client che richiede l esezuzione del task al server: Client.java Una java.policy per -Djava.security.policy Un RMISecurityManager La classe MyTask disponibile via http per -Djava.rmi.server.codebase

Fine