Esercitazione di Sistemi Distribuiti: Java RMI



Documenti analoghi
Programmazione distribuita

Java Remote Method Invocation

Socket & RMI Ingegneria del Software - San Pietro

RMI: metodi equals e hashcode

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

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

RMI Remote Method Invocation

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

RMI. Java RMI RMI. G. Prencipe

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Programmazione di sistemi distribuiti

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:

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

Introduzione alle applicazioni di rete

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

Introduzione a Java Remote Method Invocation (RMI)

Eclipse. Avviare un progetto e compilare un semplice programma

Esercitazione di Sistemi Distribuiti

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Laboratorio di Sistemi Distribuiti Leonardo Mariani

Java: Compilatore e Interprete

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

Esercitazione n 4. Obiettivi

Java Security Model e RMI

Licenza per sito Manuale dell amministratore

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

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

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

Appunti di Informatica 1

Tale attività non è descritta in questa dispensa

Programma di configurazione di reti NetWare

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Software di gestione della stampante

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

Programmazione ad oggetti

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

FPf per Windows 3.1. Guida all uso

Remote Method Invocation (RMI)

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

Le command line di Java

Programmazione a Oggetti Lezione 10. Ereditarieta

Java Web Services. Uso di Eclipse e Apache Axis

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Installazione di GFI WebMonitor

Windows 98 e Windows Me

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

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

Tabelle di riferimento Pulsanti Inserire documento Predisposizione doc Approvazione Doc Numerazione Doc Pubblicazione Albo Webservice

Programmare in Java. Olga Scotti

Studi di Settore. Nota Operativa 22/4/2013

Scrivere un programma in Java

Oggetti Lezione 3. aspetti generali e definizione di classi I

GESTIONE DEI PROCESSI

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

Comunicazione tra Processi

Comunicazione tra Processi

Corso basi di dati Installazione e gestione di PWS

AscoS3 Manuale Utente. Release 1.2

MOBILE WEB DESIGN TUTORIAL ANDROID METAIO AUGMENTED REALITY

Telematica II 17. Esercitazione/Laboratorio 6

CONFIGURARE IL DISPOSITIVO DI TELEASSISTENZA

Gestione delle informazioni necessarie all attività di validazione degli studi di settore. Trasmissione degli esempi da valutare.

Integrazione InfiniteCRM - MailUp

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

Online Help StruxureWare Data Center Expert

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Approccio stratificato

Multithreading in Java. Fondamenti di Sistemi Informativi

Manuale per l utente. Outlook Connector for MDaemon

Guida alla registrazione on-line di un DataLogger

Tutorial per l installazione del J2SE 6 e configurazione del sistema operativo

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

IBM SPSS Statistics per Linux - Istruzioni di installazione (Licenza per sito)

InteGrazIone con MICrosoFt DYnaMICs. mailup.com

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

TERMINALE. Creazione e gestione di una postazione terminale di Eureka

DATI IDENTIFICATIVI DEL PROGETTO

Protezione. Protezione. Protezione. Obiettivi della protezione

Esercizio 1: trading on-line

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise

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

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

Approfondimenti. Contenuti

Progettazione : Design Pattern Creazionali

Configuration Managment Configurare EC2 su AWS. Tutorial. Configuration Managment. Configurare il servizio EC2 su AWS. Pagina 1

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

RMI. Prova pratica di Sistemi Distribuiti:

Console di Amministrazione Centralizzata Guida Rapida

The Enterprise Service BUS. Manuale utente - VulCon

Direzione Centrale per le Politiche dell Immigrazione e dell Asilo

Corso Eclipse. Prerequisiti. 1 Introduzione

La struttura dati ad albero binario

IBM SPSS Statistics per Mac OS - Istruzioni di installazione (Licenza per sito)

File Server Resource Manager (FSRM)

Installazione del software Fiery per Windows e Macintosh

Licenza per sito Manuale dell amministratore

Inizializzazione degli Host. BOOTP e DHCP

Airone Gestione Rifiuti Funzioni di Esportazione e Importazione

Transcript:

Esercitazione di Sistemi Distribuiti: Java RMI Anno Accademico 2007-08 Marco Comerio comerio@disco.unimib.it Richiami Teorici

Oggetti distribuiti 2-16 Usuale organizzazione di un oggetto remoto con un client-side proxy. Java RMI: Caratteristiche supporta l'invocazione di metodi tra oggetti in macchine virtuali distinte le interfacce sono Java vengono passati e ritornati oggetti Java le classi vengono caricate dinamicamente più sicuro perché non si deve tradurre nulla: il bytecode è lo stesso sempre si usa lo stesso approccio in ambiente singolo e in ambiente distribuito

Java/RMI definizioni Java/RMI definizioni Si basa sulla separazione tra definizione e implementazione delle funzionalità L interfaccia definisce le operazioni che si possono invocare Una classe istanziata sul server implementa le operazioni Il client usa la definizione (l interfaccia) Il server esegue l implementazione (l oggetto istanza della classe che implementa l interfaccia) Una classe proxy istanziata sul client fa da tramite

Architettura RMI Intercetta le chiamate del client Realizza il collegamento remoto TCP/IP Classi usate in RMI Classi Remote nel proprio spazio di indirizzi si comportano come un qualsiasi altro oggetto in altri spazi di indirizzi, l oggetto può essere referenziato usando riferimenti remoti Classi Serializzabili un oggetto serializzabile è un oggetto che può essere trasferito da uno spazio di indirizzi ad un altro

Passaggio Remoto di Parametri Parametro Remoto l handle dell oggetto viene copiato da uno spazio di indirizzi ad un altro Parametro Serializzabile l oggetto viene copiato da uno spazio di indirizzi ad un altro Parametro né Serializzabile né Remoto non possono essere usati come parametri Esempio: remoteobject.execute(o,p) remoteobject è un riferimento remoto, o è un parametro remoto, e p è un parametro serializzabile spazio degli indirizzi del client spazio degli indirizzi del server remoteobject remoteobject.execute(o,p) o.getv() p o skeleton stub p p.foo() Identificazione dei server Utilizza directory (o naming) service I directory service devono essere disponibile ad un host e porta noti (well known address) RMI definisce rmiregistry sta su ogni macchina che ospita servizi remoti convenzionalmente alla porta 1099

RMI registry Sul server creazione da programma di un oggetto locale che realizza il servizio desiderato lo registra presso l RMI registry sullo stesso host con un nome pubblico OggettoRemoto server = new OggettoRemoto(); Registry registrolocale = LocateRegistry().getRegistry(); registrolocale.bind( nomeoggetto, server); RMI attiva un servizio di ascolto per quel servizio RMI registry Sul client RMI registry è accessibile attraverso il metodo lookup() della classe Naming lookup() riceve una URL con il nome dell host e del servizio desiderato restituisce il reference remoto dell oggetto che fornisce il servizio URL: rmi://<host_name> [:<name_service_port>] /<service_name>

Esercizio 1: Calculator Obiettivo Costruire un semplice calcolatore remoto ed usarlo tramite un programma client. Step per la costruzione del sistema (assumendo che RMI sia già attivo): Scrivere e compilare il codice Java per le interfacce; Scrivere e compilare il codice Java per le classi che implementano le interfacce; Generare i file.class Stub e Skeleton dalle classi che implementano le interfacce; Scrivere e compilare il codice Java per un servizio host remoto; Scrivere e compilare il codice Java per un programma RMI client; Installare ed eseguire il sistema RMI.

Step 1 Scrivere e compilare il codice Java per le interfacce. L interfaccia Calculator definisce tutti i metodi offerti dal servizio: add, sub, mul, div. L interfaccia estende Remote, e ogni signature dichiara che può essere trattata con un oggetto RemoteException. File: Calculator.java Step 2 Scrivere e compilare il codice Java per le classi che implementano le interfacce. Le classi che implementano le interfacce usano UnicastRemoteObject come link al sistema RMI. Nell esempio, la classe estende direttamente UnicastRemoteObject. Questo non è strettamente richiesto. Una classe che non estende UnicastRemoteObject può utilizzare i suoi metodi exportobject() per accedere ad RMI. Quando una classe estende UnicastRemoteObject, deve fornire un costruttore che dichiara che può essere trattato con un oggetto RemoteException. Quando il costruttore chiama super(), attiva codice in UnicastRemoteObject che attiva il link con RMI ed inizializza l oggetto remoto. File: CalculatorImpl.java

Step 3 Generare i file.class Stub e Skeleton dalle classi che implementano le interfacce. Mediante RMI compiler rmic, si generano i file stub e skeleton. Il compilatore viene eseguito sulla classe che implementa il servizio remoto: >rmic CalculatorImpl Utilizzando Java 5 SDK solo il file stub viene generato. Lo skeleton non è più necessario. File: CalculatorImpl_Stub.class Step 4 Scrivere e compilare il codice Java per un servizio host remoto. I servizi remoti RMI devono essere ospitati in un processo server. La classe CalculatorServer è un semplice esempio che fornisce le essenzialità per l hosting. CalculatorService viene registrato usando la classe Naming presso l RMI registry sullo stesso host con un nome pubblico. RMI attiva un servizio di ascolto per CalculatorService. File: CalculatorServer.java

Step 5 Scrivere e compilare il codice Java per un programma RMI client. Si utilizza il metodo lookup() della classe Naming per accedere all RMI registry. Il metodo lookup() riceve una URL con il nome dell host e del servizio desiderato e restituisce il reference remoto dell oggetto che fornisce il servizio. Il reference viene usato per invocare i metodi remoti con i seguenti parametri: sub(4,3) add(4,5) mul(3,6) div(9,3) Vengono forniti i gestori delle eccezioni. File: CalculatorClient.java Step 6 Installare ed eseguire il sistema RMI. Devono essere inizializzate tre console: Si inizializza la console per l RMIRegistry usando il comando Java rmiregistry. Si inizializza la console per il server che ospita CalculatorService. Il servizio viene caricato in memoria e rimane in attesa di una chiamata da parte del client. Si inizializza la console per il client. I risultati prodotti sono i seguenti: 1, 9, 18 e 3

Esercizio 2: printer server Ambiente L esercizio verrà svolto utilizzando: Eclipse 3.1; RMI Plug-in per Eclipse (http://www.genady.net/rmi/index.html); JDK 1.5. Il codice Java è tratto dal tutorial fornito insieme al plug-in.

Traccia dell esercizio esercizio Sviluppare un applicazione che consenta ad un client di inviare richieste di stampa ad una stampante scelta tra tre che risultano (virtualmente) collegate. Ciascuna stampante ha un identificatore che può essere utilizzato dal client per verificarne lo stato. L applicazione client riceve il nome del server come argomento, si connette all RMI registry, sceglie in maniera casuale una stampante tra le tre disponibili e sottomette una richiesta di stampa (una semplice stringa di testo). Dopo aver sottomesso la richiesta, il client effettua query per verificare lo stato di avanzamento della stampa. Le query vengono effettuate fino a quando la stampa richiesta non risulta ultimata. Creazione Interfaccia RemotePrinter L interfaccia RemotePrinter deve estendere java.rmi.remote e deve definire metodi remoti per: Sottomettere un richiesta di stampa; Verificare se la stampa è stata terminata; Verificare lo stato della stampante. Ciascun metodo deve dichiarare una RemoteException. L interfaccia deve essere comune tra il client e il server. Non deve essere parte del progetto server (scelta usuale) ma deve essere creata in un progetto separato. Il client e il server avranno l interfaccia comune sui lori build path.

Creazione Interfaccia RemotePrinter Creazione guidata dell interfaccia mediante l utilizzo dell RMI Plug in di Eclipse Creare nuovo progetto Java per l interfaccia condivisa; Creare un nuovo package; Creare scheletro dell interfaccia mediante procedura guidata; Definire metodi: public int submitjob(string text) public boolean iscomplete(int id) public String getprinterstatus() Creazione lato server Il progetto server deve contenere l implementazione dell interfaccia RemotePrinter. La classe Java deve estendere la classe UnicastRemoteObject per rendere l oggetto visibile nel sistema RMI. Il metodo main() deve consentire di: Effettuare la connessione al registry RMI locale; Creare tre istanze di printer; Registrare le tre printer nel registro RMI locale. La registrazione deve essere effettuata accedendo direttamente il registro (l utilizzo di Naming.rebind() potrebbe essere un alternativa). Se non si verificano errori, il messaggio "The printer server is ready" deve essere visualizzato sulla console.

Creazione lato server Creazione guidata del lato server mediante l utilizzo dell RMI Plug in di Eclipse Creare nuovo progetto Java; Creare collegamento al progetto contenente l interfaccia comune; Creare un nuovo package; Creare scheletro della classe mediante procedura guidata: Superclass: UnicastRemoteObject Interface: RemotePrinter Definire il costruttore della classe; Implementare i metodi definiti nell interfaccia; Generare lo stub mediante il comando Enable Stubs Generation ; Visualizzare lo stub. Creazione lato server I metodi vengono implementati nel seguente modo: public int submitjob(string text): permette di inoltrare una nuova richiesta di stampa. Se l id della richiesta è pari, lo stato viene settato come completato. public boolean iscomplete(int id): permette di verificare lo stato di una richiesta. Dopo la chiamata lo stato viene settato come completato. public String getprinterstatus(): verifica lo stato delle stampanti. Ritorna in maniera random uno dei seguenti valori:"ready,"error or "Unknown". public static void main(string[] args): registra tre stampanti nel registro locale.

Creazione lato client Il progetto client deve consistere di una sola classe Java. Il metodo main() della classe deve: Connettersi al registro sulla macchina server e accedere in maniera casuale ad una delle tre stampanti remote disponibili; Inviare una nuova richiesta di stampa (una semplice stringa di testo) e salvare l id; Verificare lo stato della richiesta e della stampante fino a quando la richiesta risulta completata. Creazione lato client Creazione guidata del lato client mediante l utilizzo dell RMI Plug in di Eclipse Creare nuovo progetto Java; Creare collegamento al progetto contenente l interfaccia comune; Creare un nuovo package; Implementare il metodo main(): Installazione del security manager System.setSecurityManager(newRMISecurityManager()); Accesso al registry Registry registry = LocateRegistry.getRegistry(args[0]); Collegamento ad una delle tre stampanti RemotePrinter printer = (RemotePrinter)registry.lookup("printer" + selectedprinter); Invio di una richiesta di stampa int jobid = printer.submitjob( Message"); Verifica stato della richiesta e della stampante fino a quando la richiesta risulta completata while (!printer.iscomplete(jobid)) { System.out.println("Print job" +jobid + "is awaiting completion."); System.out.println("Printer status: "+printer.getprinterstatus());}

Esecuzione dell applicazione Esecuzione dell applicazione mediante l utilizzo dell RMI Plug in di Eclipse Avviare il registry sulla porta 1099; Avviare il server come applicazione RMI Settare il codebase per la RMI VM Avviare il client come applicazione RMI Settare il security manager per la RMI VM Passare come parametro localhost Il risultato viene visualizzato nella console. Esempio: Submitted print job (id=0) to printer1 Print job 0 is awaiting completion. Printer status: Ready Done printing La proprietà codebase La proprietà codebase è una proprietà della VM che è responsabile della configurazione per l accesso remoto ad una classe. Per un progetto server, codebase dichiara la collocazione dell interfaccia remota e dello stub. Nell esempio, il progetto client non ha nessun punto di accesso al progetto server (ad esempio, non ha accesso diretto allo stub). La soluzione consiste nell annotare l oggetto remoto con una proprietà codebase che agisce da classpath. Quando si utilizza l oggetto remoto è possibile consultare codebase per risolvere il class-loading.

Security Manager Il SecurityManager permette la specifica dei permessi di accesso. L RMISecurityManager può essere: configurato: sovrascrivendo i suoi metodi checkpermission(permission perm); configurato specificando un file di policy opzione della jvm Djava.security.policy=... In generale è possibile creare dei SecurityManager personalizzati estendendo la classe SecurityManager, o modificando i permessi nel file <JAVA_HOME>/lib/security/java.security Security policy La security policy generata per Printer server assegna ogni tipologia di permessi all applicazione. La policy è richiesta del RMISecurityManager e l applicazione non viene eseguita con successo se non viene avviata specificando un opportuno security policy file. La security policy può essere settata mediante l RMI Launcher o settando manualmente la proprietà java.security.policy.

Esempio di file di policy grant { permission java.security.allpermission; // Other options: permission java.net.socketpermission "127.0.0.1:1024-", "accept, connect, listen, resolve"; permission java.net.socketpermission "localhost:1024-", "accept, connect, listen, resolve"; permission java.net.socketpermission "*:1024-65535", "connect,accept"; permission java.net.socketpermission "*:80", "connect"; permission java.net.socketpermission "*:1024-65535", "connect,accept"; permission java.io.filepermission "c:\\home\\ann\\public_html\\classes\\-", "read"; permission java.io.filepermission "c:\\home\\jones\\public_html\\classes\\-", "read"; };