programmazione object oriented in java · 2011-12-16 · java.rmi.server.remoteobject e dalle sue...

34
© 2000 © 2000 - Massimiliano Pianciamore Massimiliano Pianciamore CEFRIEL CEFRIEL Consorzio per la Formazione e la Ricerca Consorzio per la Formazione e la Ricerca in Ingegneria dell’Informazione in Ingegneria dell’Informazione Politecnico Politecnico di Milano di Milano Programmazione Object Oriented in Java Programmazione Object Oriented in Java Java Remote Method Invocation Java Remote Method Invocation Docente: Docente: Diego Peroni Diego Peroni CEFRIEL CEFRIEL [email protected] [email protected] Java RMI Java RMI © 2000 © 2000 - Massimiliano Pianciamore Massimiliano Pianciamore -2- Contesto e motivazioni Architettura e concetti di base Componenti di RMI RMIRegistry Interfacce, eccezioni e classi Lo sviluppo di una applicazione L’esecuzione di una applicazione Caricamento dinamico delle classi RMI e sicurezza Il passaggio dei parametri L’utilizzo del registry Indice degli argomenti Indice degli argomenti

Upload: others

Post on 19-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

1

© 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore

CEFRIELCEFRIELConsorzio per la Formazione e la RicercaConsorzio per la Formazione e la Ricercain Ingegneria dell’Informazionein Ingegneria dell’Informazione

PolitecnicoPolitecnicodi Milanodi Milano

Programmazione Object Oriented in JavaProgrammazione Object Oriented in Java

Java Remote Method InvocationJava Remote Method Invocation

Docente:Docente:Diego PeroniDiego Peroni

[email protected]@cefriel.it

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 22 --

Contesto e motivazioni

Architettura e concetti di baseComponenti di RMIRMIRegistryInterfacce, eccezioni e classi

Lo sviluppo di una applicazioneL’esecuzione di una applicazione

Caricamento dinamico delle classiRMI e sicurezza

Il passaggio dei parametriL’utilizzo del registry

Indice degli argomentiIndice degli argomenti

Page 2: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

2

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 33 --

IntroduzioneIntroduzione

RMI si pone come obiettivo quello di facilitare la comunicazione fra applicazioni Java residenti su macchine remote, presupponendo un ambiente omogeneo JavaRMI fornisce al programmatore una tecnologia molto simile al concetto di Remote Procedure Call.

Realizzazione di applicazioni distribuite ad oggetti in linguaggio JavaPermette di sfruttare al pieno le caratteristiche di Java anche nella programmazione distribuita

A differenza di RPC utilizza il paradigma Object OrientedIl client invoca metodi di oggetti che appaiono locali (sulla stessa Java Virtual Machine) ma in realtà sono repliche di oggetti presenti fisicamente su JVM remoteRMI, proposto dalla Sun, costituisce sostanzialmente l'alternativa a CORBA.

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 44 --

Gli obiettivi di RMIGli obiettivi di RMI

Supportare l’invocazione di oggetti remoti fra VM diverse

Supportare le callback tra server e clientIntegrare il modello distribuito nel linguaggio Java conservandone la semanticaDefinire in modo chiaro le differenze fra oggetti locali e remotiRendere la progettazione di applicazioni distribuite quanto più semplice possibileRispettare la sicurezza dell’ambiente runtime di JavaPermettere molti meccanismi di invocazione di oggetti remoti (ad es. invocazione singola di un oggetto o invocazioni multipledi un oggetto replicato su più locazioni)

Page 3: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

3

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 55 --

Gli obiettivi di RMI (2)Gli obiettivi di RMI (2)

Fornire un sistema di gestione della memoria distribuito (Distributed Garbage Collector) per disallocare automaticamente oggetti remotiPossibilità di supportare diversi meccanismi (protocolli) di trasporto per le invocazioni remoteEstendere le caratteristiche di Java (sicurezza e caricamento dinamico delle classi) nella comunicazione fra Java VM distribuiteTrasmettere le eccezioni sollevate durante le invocazioni di metodi remoti alle varie JavaVM coinvolte nella comunicazione

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 66 --

Definizioni:Definizioni:

Oggetto remoto: oggetto i cui metodi possono essere invocati da una Java Virtual Machine diversa da quella in cui l’oggetto risiede

Interfaccia remota: interfaccia Java che dichiara quali sono i metodi che possono essere invocati da una diversa Java Virtual MachineServer: uno o più oggetti remoti che, implementando una o più interfacce remote, offrono delle risorse (dati e/o procedure) a macchine esterne distribuite sulla reteRemote Method Invocation (RMI): invocazione di un metodo presente in una interfaccia remota implementata da un oggetto remoto. La sintassi di una invocazione remota è identica a quella locale

Page 4: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

4

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 77 --

Contesto e motivazioni

Architettura e concetti di baseComponenti di RMIRMIRegistryInterfacce, eccezioni e classi

Lo sviluppo di una applicazioneL’esecuzione di una applicazione

Caricamento dinamico delle classiRMI e sicurezza

Il passaggio dei parametriL’utilizzo del registry

Indice degli argomentiIndice degli argomenti

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 88 --

Architettura di RMIArchitettura di RMI

ClientRichiede i servizi offerti dai server

ServerE’ il fornitore dei servizi richiesti dai client

RMIRegistryServizio di Naming: consente di associare un identificatore simbolico al riferimento effettivo ad un oggetto remotoViene utilizzato dal client in fase di bootstrap per recuperare il riferimento al “primo” oggetto remoto

NOTA: i ruoli di client e di server non sono rigidamente fissati e valgono nel contesto di una singola interazione

Page 5: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

5

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 99 --

Architettura diArchitettura di RMIRMI

Livello applicazioni

Java virtual machine

Rete

chiamata di un metodo

risposta

rmiregistry

Remote Ref. Layer

Client

Transport Layer

Stub

Java virtual machine

Remote Ref. Layer

Server

Transport Layer

Skeleton

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1010 --

Le componenti di RMILe componenti di RMI

Una invocazione RMI parte dal livello applicativo client, attraversa i vari strati di RMI fino ad arrivare al trasporto. Non appena la chiamata arriva sulla JavaVM del server, viene fatta risalire attraverso i vari strati di RMI per arrivare all’opportuno oggetto Java che implementa il servizio richiesto.La risposta segue la strada inversa: parte dallo skeleton, passa nel remote reference layer del server, nel suo strato di trasporto ed arriva alla macchina client, dove risale fino all’applicazione.

Page 6: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

6

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1111 --

Le componenti di RMILe componenti di RMI

Lo strato stub/skeletonLo stub è il riferimento locale che il client possiede dell’oggetto remoto. Lo stub inoltra le richieste del client all’opportuna JavaVM Lo skeleton riceve le invocazioni dallo strato inferiore e le smista all’opportuno oggetto Java che implementa il metodo richiesto

Lo strato di riferimento remoto si occupa di gestire la semantica della chiamata

Un primo compito riguarda la comunicazione verso lo strato inferiore dell’apertura di connessioni verso un singolo host se l’oggetto remoto è unicast o verso più host se l’oggetto remoto è multicastSi occupa anche di nascondere agli strati superiori le differenze fra il caso in cui il server è costantemente in esecuzione su una macchina dal caso in cui il server si attiva nel momento in cui viene fatta una chiamata

Lo strato di trasporto provvede all’instaurazione ed alla gestione delle connessioni verso gli host remoti

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1212 --

A partire dalla classe che implementa il servizio, tramite il “compilatore” rmic è possibile generare lo stub e lo skeleton relativi al servizio stessoLo stub ora risiede sul server: verrà caricato automaticamente sul client dall’AppletClassLoader o dall’RMIClassLoaderIl sistema Java carica da remoto solo le classi non disponibili localmente

Implementazione della classe (residente sul server)

RMIC

Stub Skeleton

Strato Strato Stub/SkeletonStub/Skeleton

Page 7: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

7

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1313 --

Architettura di RMI: Architettura di RMI: Stubs e Marshalling dei parametriStubs e Marshalling dei parametri

Per il client l’invocazione di un metodo su un oggetto remoto non è diversa da una chiamata di metodo su un oggetto localeLa chiamata viene ricevuta da un oggetto surrogato dell’oggetto server, chiamato “stub” e attivo sulla macchina client, che si occupa di

Iniziare una connessione con la Java Virtual Machine remotaConvertire i parametri della chiamata di metodo in un formato adatto alla trasmissione in rete (Parameter Marshaling) e trasmettere i parametri serializzatiAttendere il risultato della chiamataConvertire il risultato dell’operazione (o l’eventuale eccezione ricevuta) e restituire il risultato al client

Lo stub maschera la serializzazione dei parametri ed i dettagli di basso livello della comunicazione, in modo da presentare al client un meccanismo di invocazione semplificato

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1414 --

Architettura di RMI: SkeletonsArchitettura di RMI: Skeletons

Nella Java Virtual Machine Remota, ogni oggetto remoto può avere un corrispondente oggetto skeleton

Uno skeleton è responsabile del dispatching della chiamata all’oggetto che implementa l’interfaccia remotaNegli ambienti interamente basati su piattaforma Java 2 v1.2 gli skeleton non sono più necessari

Viene utilizzato del codice “generico”, ovvero non specializzato per un particolare oggetto server

Page 8: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

8

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1515 --

E’ responsabile di indirizzare ogni chiamata remota verso l’oggetto che implementa il metodo corrispondenteEffettua l’unmarshalling dei parametri, passando da stream agli oggetti Java corrispondentiEffettua il marshalling dei valori di ritorno (o delle eccezioni) dei metodi remoti invocati.

NB: il server, nell’implementare un servizio, potrebbe avvalersi di altri oggetti che potrebbero essere a loro volta remoti.

impl obj1

impl obj2

impl objN

Skeleton

call metodo di obj1

call metodo di obj2

call metodo di objN

Remote Ref. Layer

Architettura di RMI:Architettura di RMI:Skeletons Skeletons -- FunzionalitàFunzionalità

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1616 --

Questo strato definisce la semantica delle chiamate agli oggetti remotiOgni implementazione di oggetto remoto sceglie la propria semantica (es. oggetto unicast, multicast, ..)Definisce il protocollo specifico con cui effettuare le chiamate remote

invocazioni unicast “point-to-point”invocazioni verso gruppi di oggettistrategie di riconnessione verso l’oggetto remotosupporto alle strategie di replicazione di oggetti remotisupporto per le strategie di attivazione degli oggetti remoti

Java VM2

Remote Ref. Layer Remote Ref. Layer

Transport Layer Transport Layer

Java VM1

semantica della chiamata agli oggetti remoti

connessione fisica tra le due JavaVM remote

Architettura di RMI:Architettura di RMI:Remote Reference LayerRemote Reference Layer

Page 9: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

9

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1717 --

I vari client vedono solamente l'interfaccia remota, ma non l'implementazione del servizioQuale meccanismo offre RMI per l'individuazione degli oggetti remoti?

Server RMI - HOST1

ContoCorrenteBancario

Object Implementation

Conto Bancario

Interfaccia

ObjectClient 1

Client1: filiale1

Client RMI - HOST2

ObjectClient n

ClientN: filialeN

Client RMI - HOSTn

Invocazioni di metodi

Architettura di RMI:Architettura di RMI:Localizzazione degli oggetti remotiLocalizzazione degli oggetti remoti

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1818 --

Architettura di RMI:Architettura di RMI:RMIRegistryRMIRegistry

Affinché un’applicazione client possa invocare metodi di un oggetto remoto, deve inizialmente ottenere un riferimento a tale oggetto (in seguito, può ottenere nuovi riferimenti come risultati di invocazione di metodi)

JavaRMI fornisce un semplice Name Server, chiamato RMIRegistry, che viene utilizzato dal client in fase di bootstrap per recuperare il riferimento al “primo” oggetto remotoRMIRegistry è un processo che deve essere lanciato sulle macchine da cui si vogliono esportare oggetti remotiIl Registry è un oggetto che realizza una mappa fra nomi (stringhe) ed identificatori di oggetti remoti

Page 10: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

10

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 1919 --

Architettura di RMI:Architettura di RMI:RMIRegistry (2)RMIRegistry (2)

Operazioni tipiche effettuate sul registry dagli oggetti client e server:

bind, rebind, unbind (Associazione di un nome simbolico al riferimento ad un oggetto remoto, rimozione dell’associazione)lookup, list (Richiesta del riferimento all’oggetto remoto associato ad un dato identificatore simbolico, lista dei nomi presenti)

Queste operazioni sono implementate da metodi statici nella classe java.rmi.Naming

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2020 --

Client 1

Client N Server

Registry

Naming.bind(..)/ Naming.rebind(..)

Naming.lookup(..)

Naming.list()

Architettura di RMI:Architettura di RMI:RMIRegistry (3)RMIRegistry (3)

Le operazioni di bind, rebind, unbind possono essere fatte

solo dall'host su cui si trova il registroper motivi di sicurezza: un client non deve modificare il registry del server

le operazioni di lookup e list possono essere fatte da qualunque host

Page 11: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

11

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2121 --

Il modello RMI: interfacce, Il modello RMI: interfacce, eccezioni e classieccezioni e classi

Tutte le interfacce remote sono interfacce Java che devono estendere, direttamente o indirettamente, l’interfaccia java.rmi.Remote, la quale non definisce alcun metodo

La classe java.rmi.RemoteException è la superclasse di tutte le eccezioni che possono essere sollevate dal sistema runtime di RMI

Per assicurare la robustezza di un’applicazione RMI, tutti i metodi dichiarati nelle interfacce remote devono dichiarare questa eccezione nella propria intestazioneQuesta eccezione viene sollevata dal runtime di RMI quando l’invocazione di un metodo remoto fallisce (per esempio cade la connessione, o il server non può essere contattato, ...). Catturando tale eccezione nelle applicazioni client, è possibile svolgere delle azioni correttive

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2222 --

Il modello RMI: interfacce, Il modello RMI: interfacce, eccezioni e classieccezioni e classi

Le funzioni di un server JavaRMI sono fornite dalla classe java.rmi.server.RemoteObject e dalle sue sottoclassi:

java.rmi.server.RemoteServerjava.rmi.server.UnicastRemoteObject

RemoteObject fornisce la semantica remota degli oggetti, implementando i metodi hashCode, equals, toString Le funzioni necessarie a creare gli oggetti ed esportarli (rendendoli disponibili da remoto) sono fornite dalla classe RemoteServer e dalle sue sottoclassi.

A seconda della sottoclasse scelta, si possono avere diverse semantiche degli oggetti remoti esportati (oggetti singoli, replicati su più server, ...)

La classe UnicastRemoteObject definisce il riferimento ad un unico (Unicast) oggetto remoto, il cui riferimento è valido solo se il processo server è attivo. Tale classe fornisce il supportoper gestire il riferimento all’oggetto

Page 12: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

12

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2323 --

Il modello RMI: interfacce, Il modello RMI: interfacce, eccezioni e classieccezioni e classi

Remote(from rmi)

<<Interface>>

RemoteException(from rmi)

RemoteServer(from server)

RemoteObject(from server)

Object(from lang)

RemoteStub(from server)

Activatable(from activation)

UnicastRemoteObject(from server)

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2424 --

Contesto e motivazioniArchitettura e concetti di base

Componenti di RMIRMIRegistryInterfacce, eccezioni e classi

Lo sviluppo di una applicazioneL’esecuzione di una applicazione

Caricamento dinamico delle classiRMI e sicurezza

Il passaggio dei parametriL’utilizzo del registry

Esempio: Gestione C/CRealizzazione di callbacks in RMI

Esempio: Una Chat in JavaGarbage collection distribuito

Indice degli argomentiIndice degli argomenti

Page 13: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

13

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2525 --

Definizione dell’interfacciaremota

Deve estendere java.rmi.RemoteCiascun metodo deve dichiararejava.rmi.RemoteException nella lista delle possibili eccezioni sollevate

Definizione del codice dell’oggetto remoto

deve implementare l’interfaccia remota deve estendere la classe java.rmi.server.UnicastRemoteObject

Creazione di stub e skeletonsi usa il comando rmic

Definizione del codice del server

istanzia l’oggetto remoto e lo registra presso il registry

Definizione del codice del clientrichiede al registry unriferimento all’oggetto remotolo assegna ad una variabile che ha l’interfaccia remota come tipo

I punti essenziali per lo I punti essenziali per lo sviluppo sviluppo di una semplice applicazionedi una semplice applicazione

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2626 --

Esempio: l’interfaccia remotaEsempio: l’interfaccia remota

import java.rmi.*;public interface ProvaRMIServer

extends Remote {public void print(String s)

throws RemoteException;public int getNumber()

throws RemoteException;}

Ciascun metodo presente nell’interfaccia remota, oltre a dover sollevare RemoteException, può anche sollevare eccezioni specifiche dell’applicazioneL’interfaccia remota deve essere dichiarata public per poter essere utilizzata da altre JavaVM. In caso contrario, un client otterrà un errore quando tenterà di ottenere un riferimento a tale oggetto

Page 14: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

14

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2727 --

Naming ConventionsNaming Conventions

Suffisso Descrizione Nessun suffisso (es. Product)

Interfaccia remota

Suffisso Impl (es. ProductImpl)

Classe Server che implementa una interfaccia remota

Suffisso Client (es. ProductClient)

Client che invoca metodi sull’oggetto remoto

Suffisso _Stub (es. ProductImpl_Stub)

Classe stub automaticamente generata con rmic

Suffisso _Skel (es. ProductImpl_Skel)

Classe skeleton automaticamente generata con rmic (necessaria per JDK 1.1)

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2828 --

L’Implementazione di L’Implementazione di un’interfaccia remotaun’interfaccia remota

Una classe remota:Deve implementare l’interfaccia remotaDeve essere esportata per poter accettare richieste di servizio dai client

Può estendere (direttamente o indirettamente) la classe UnicastRemoteObject, da cui eredita il comportamento remoto fornito dalle classi RemoteObject e RemoteServer

– In particolare l’esportazione automatica al momento della creazione (prevista nel costruttore vuoto)

Se non estende UnicastRemoteObject l’esportazione deve essere esplicitamente richiesta subito dopo la creazione (utilizzando il metodo statico exportObject di UnicastRemoteObject

Page 15: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

15

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 2929 --

L’Implementazione di L’Implementazione di un’interfaccia remotaun’interfaccia remota

Un’unica classe può implementare più interfacce remoteLa classe può estendere un’altra implementazione di classe remotaLa classe può definire altri metodi oltre quelli presenti nell’interfaccia, ma questi metodi non saranno resi visibili all’esterno, per cui non potranno essere invocati da altre JavaVM.

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3030 --

Esempio: l’implementazione del serverEsempio: l’implementazione del server

import java.rmi.*;import java.rmi.server.UnicastRemoteObject;

public class ProvaRMIServerImpl extendsUnicastRemoteObject implements ProvaRMIServer {int counter;public ProvaRMIServerImpl()throws RemoteException {}public void print(String s)throws RemoteException

{System.out.println(s);}public int getNumber()throws RemoteException

{return counter++; }}

Page 16: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

16

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3131 --

public static void main(String[] args) {try {

System.setSecurityManager( newRMISecurityManager());

ProvaRMIServerImpl server = new ProvaRMIServerImpl();

Naming.rebind(”//brahms/ProvaRMIServer", server);

System.out.println("Server bound");} catch (Exception e) {

e.printStackTrace();}

}

Esempio: l’implementazione del serverEsempio: l’implementazione del server

Non sempre strettamente necessario sul server

Formato generale:rmi://hostname:port/nomesimbolico

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3232 --

Esempio: il clientEsempio: il client

import java.rmi.*;public class ProvaRMIClient {public static void main(String[] args) {try {System.setSecurityManager(

new RMISecurityManager());System.out.println("Looking up server...");ProvaRMIServer server = (ProvaRMIServer) Naming.lookup("//"+args[0]+”/ProvaRMIServer");System.out.println("Server bound...");server.print("prima prova");System.out.println(server.getNumber());

} catch (Exception e) {e.printStackTrace();

} } }

Page 17: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

17

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3333 --

Esempio: la compilazioneEsempio: la compilazione

javac ProvaRMIServerImpl.javacompila il server

javac ProvaRMIClient.java

compila il clientrmic ProvaRMIServerImpl

crea le classi ProvaRMIServer_Skel e ProvaRMIServer_Stub

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3434 --

Contesto e motivazioni

Architettura e concetti di baseComponenti di RMIRMIRegistryInterfacce, eccezioni e classi

Lo sviluppo di una applicazioneL’esecuzione di una applicazione

Caricamento dinamico delle classiRMI e sicurezza

Il passaggio dei parametriL’utilizzo del registry

Indice degli argomentiIndice degli argomenti

Page 18: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

18

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3535 --

Esecuzione di una applicazioneEsecuzione di una applicazione

rmiregistry

lancia il registryjava ProvaRMIServerImpl

lancia il serverjava ProvaRMIClient localhost

lancia il client dicendo di collegarsi a localhostCon queste impostazioni il tutto funziona solo se

Lo stub dell’oggetto remoto è nel classpath del client Lo stub dell’oggetto remoto è “visibile” per il registry (attraverso il classpath impostato al momento del lancio)Non viene impostato un security manager nel client (e nel server)

In realtà in questo modo non è stata realizzata un’applicazione realmente distribuita (o meglio, realmente distribuibile)!!

Per raggiungere lo scopo occorrono ulteriori impostazioni

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3636 --

Al contrario di altre architetture per sistemi distribuiti, in cui gli stub devono essere sempre visibili al client, RMI può caricare dinamicamente

Gli stub degli oggetti remoti Tutte le altre classi coinvolte nell’invocazione (es. parametri e valori di ritorno) non disponibili nel classpath del chiamante

Per caricare gli oggetti da siti remoti, RMI usa l’Object Serialization. Quindi tutte le classi caricate devono essere serializzabili

Caricamento dinamico delle classiCaricamento dinamico delle classi

Page 19: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

19

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3737 --

Caricamento dinamico delle classiCaricamento dinamico delle classi

Le classi possono essere scaricate attraverso un web serverPer indicare dove trovare gli stubs che dovranno essere scaricati dinamicamente, si lancia il server con il seguente comando:java -Djava.rmi.server.codebase="http://brahms:8000/" ProvaRMIServerImpl

Perchè client e server possano istanziare correttamente le classi scaricate, è necessario configurare il security manager

Questo impedisce alle classi scaricate di eseguire azioni non legali

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3838 --

Client

ProvaRMIClient.class

ProvaRMIServer.classProvaRMIServer.java

ProvaRMIServerImpl.java

ProvaRMIClient.java

Sorgenti

ProvaRMIServer.class

ProvaRMIServerImpl.class

ProvaRMIClient.class

Classi

Server

ProvaRMIServer.class

ProvaRMIServerImpl.class

ProvaRMIServerImpl_Stub.class

Download

ProvaRMIServerImpl_Stub.class

ProvaRMIServer.class

Posizionamento dei file nelle Posizionamento dei file nelle directorydirectory

Page 20: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

20

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 3939 --

Caricamento dinamico delle Caricamento dinamico delle classi: Osservazioniclassi: Osservazioni

Gli URL specificati con la proprietà java.rmi.server.codebase

devono consentire l’accesso agli stub degli oggetti remoti per il caricamento dinamico ad opera del clientdevono conesntire l’accesso anche a TUTTE le classi dalle quali gli stub dipendono

in particolare anche l’interfaccia remota deve essere raggiungibile attraverso gli URL specificati con java.rmi.server.codebase (e quindi essere contenuta nella directory download)se questo vincolo non viene rispettato l’operazione di bind o rebind effettuata dal server sull’rmiregistry non va a buon fine

La classe stub del server remoto deve sempre essere contenuta nella directory “server”, pena il fallimento delle operazioni dibind, rebind effettuate dal server

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4040 --

Sicurezza in RMISicurezza in RMI

Le classi prelevate da remoto sono considerate “non affidabili”

E’ necessario istanziare un opportuno SecurityManager Se non è impostato un SecurityManager, il caricamento delle classi remote è disabilitato (ogni tentativo genera un errore)Il SecurityManager deve essere installato come prima operazioneGli applet sono soggetti alle restrizioni del security manager attivo nella JVM del browser (controlli sul codice+host di provenienza)

Page 21: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

21

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4141 --

Un security manager richiede l’utilizzo di un file dipolicies nel quale vengono specificati i permessi di effettuare diverse tipologie di operazioni da parte delle classi caricate dai diversi codebase

Il file può essere collocato in una qualsiasidirectory e può avere un nome qualsiasiLa posizione del file di policy viene specificata attraverso la proprietà java.security.policy sulla riga di comandojava –Djava.security.policy=c:\<dir>\<nomefile> ProvaRMIClient localhost

Sicurezza in RMI (2)Sicurezza in RMI (2)

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4242 --

Sicurezza in RMI (3)Sicurezza in RMI (3)

Per semplicità si può impostare un file di policy in cui viene definito una “global permission”

chiunque può fare qualsiasi cosaIl policy file “policy.java” può essere creato utilizzando unnormale text editor oppure attraverso il tool “policytool”

grant {// Allow everything for nowpermission java.security.AllPermission;

};

Ovviamente non è opportuno utilizzare una policy di questo tipo in un production environment….

Page 22: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

22

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4343 --

Sicurezza in RMI (4)Sicurezza in RMI (4)

Occorre impostare le policies sul client sul server se nel codice viene impostato un security manager

Client e server dovranno essere eseguiti impostandola proprietà java.security.policy con il path del policy file creato:

Sul serverjava -Djava.security.policy=.\policy.java

ProvaRMIServerImpl

Sul client java -Djava.security.policy=.\policy.java ProvaRMIClient

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4444 --

Sicurezza in RMI (5)Sicurezza in RMI (5)

Formato generale di una entry in un file di policygrant [codeBase "URL"] { permissionpermissionClassName "target", "action"; //... };

Definisce in modo dettagliato i permessi attribuiti alle classi caricate dal codebase specificato

Se non viene specificato il codebase le permission si applicano a tutte le classi, indipendentemente dalla loro provenienza

Page 23: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

23

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4545 --

Sicurezza in RMI (6)Sicurezza in RMI (6)

Un esempio di policy file più dettagliato:grant { permission java.net.SocketPermission"*:1024-65535", "connect,accept"; permission java.net.SocketPermission "*:80", "connect"; };

Possibilità di connettersi a qualsiasi host e di accettare connessioni da qualsiasi host e su qualsiasi porta da 1024 a 65535 (utile per connettersi a rmiregistry)Possibilità di connettersi a qualsiasi host sulla porta 80 (http server, ad esempio per il download dinamico delle classi)

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4646 --

Sicurezza in RMI (7)Sicurezza in RMI (7)

Informazioni su policy files e permissions:Default Policy Implementation and Policy File Syntax:

http://java.sun.com/products/jdk/1.2/docs/guide/security/PolicyFiles.html

Permissions in JDK1.2:http://java.sun.com/products/jdk/1.2/docs/guide/security/permissions.html

Page 24: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

24

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4747 --

Attivazione del registry (classpath vuoto)rmiregistryEsecuzione del server (classpath contenente la directory server)java -Djava.security.policy=.\policy.java-Djava.rmi.server.codebase="http://brahms:8000/.../download" ProvaRMIServerImplEsecuzione del client (classpath contenente la directory client)java -Djava.security.policy=.\policy.java ProvaRMIClient

localhost

Esecuzione dell’applicazioneEsecuzione dell’applicazione

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4848 --

rmiregistry

Client Stub Skel Server

2: lookup 1: rebind

3: print(“prima prova”)4: getNumber()

0: start rmiregistry

EsempioEsempio: : LLee interazioni trainterazioni tra ii vari componentivari componenti

Page 25: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

25

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 4949 --

Contesto e motivazioni

Architettura e concetti di baseComponenti di RMIRMIRegistryInterfacce, eccezioni e classi

Lo sviluppo di una applicazioneL’esecuzione di una applicazione

Caricamento dinamico delle classiRMI e sicurezza

Il passaggio dei parametriL’utilizzo del registry

Indice degli argomentiIndice degli argomenti

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5050 --

Argomenti e risultati di metodi Argomenti e risultati di metodi remotiremoti

Un argomento o valore di ritorno di un oggetto remoto può essere qualunque tipo Java che sia Serializable

tipi Java primitivioggetti Java remotioggetti Java (anche non remoti) che implementano l’interfaccia java.io.Serializable

Per gli applet, se la definizione della classe di un parametro o risultato non è disponibile localmente, viene caricata dinamicamente dall’AppletClassLoaderPer le applicazioni, se la definizione della classe di un parametro (o risultato) non è stata ancora caricata, viene caricata o dal ClassLoader locale (che fa riferimento al CLASSPATH locale), o dall’RMIClassLoader, che usa la proprietà java.rmi.server.codebase del server

Page 26: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

26

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5151 --

Il passaggio dei parametri ed Il passaggio dei parametri ed i valori di ritornoi valori di ritorno

Due tipologie di parametri e valori di ritorno:Riferimenti ad oggetti remoti

Si acquisisce un riferimento all’oggetto. L’oggetto rimane unico e risiede sul server, anche se più componenti ne acquisiscono il riferimento

– viene passato per copia lo stub dell’oggettoUn oggetto remoto passato come parametro può implementare solo interfacce remote e non interfacce locali

Riferimenti ad oggetti non remotiUna copia dell’oggetto viene trasferita sul sito remoto

– se un parametro non remoto passato da client al server viene da quest’ultimo modificato, il client non risente di tale modifica

l’oggetto locale deve essere serializzabile

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5252 --

Intermediario ServerClient1

2

Passaggio di riferimentiPassaggio di riferimenti adad oggetti oggetti remotiremoti

import java.rmi.*;

public interface ProvaRMIIntermed extends Remote {public ProvaRMIServer getProvaRMISrv() throws RemoteException;

}

Page 27: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

27

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5353 --

Passaggio di riferimentiPassaggio di riferimenti adad oggetti remotioggetti remoti::Implementazione del server intermedioImplementazione del server intermedio

public class ProvaRMIIntermedImpl extendsUnicastRemoteObject implements ProvaRMIIntermed{ProvaRMIServer s;public ProvaRMIServer getProvaRMISrv() throwsRemoteException { return s; }public static void main(String[] args) {

try {System.setSecurityManager(new

RMISecurityManager());System.out.println("Looking up server...");s = (ProvaRMIServer) Naming.lookup(“//” +

args[0] + “/” args[1]);System.out.println(“Server located...");

}}

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5454 --

Passaggio di riferimentiPassaggio di riferimenti adad oggetti remotioggetti remoti: : Implementazione del clientImplementazione del client

import java.rmi.*;

public class ProvaRMIInterClient {public static void main(String[] args) {

try {System.setSecurityManager(new

RMISecurityManager());System.out.println("Looking up server...");ProvaRMIIntermed s1 = (ProvaRMIIntermed)

Naming.lookup(args[0] + args[1]);System.out.println("Intermed located...");

Page 28: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

28

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5555 --

Passaggio di riferimentiPassaggio di riferimenti adad oggetti remotioggetti remoti::Implementazione del client (2)Implementazione del client (2)

ProvaRMIServer server = s1.getProvaRMISrv();

System.out.println(“Server located...");server.print("prima prova");System.out.println(server.getNumber());

} catch (Exception e) {e.printStackTrace();

} }

}

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5656 --

Passaggio di riferimentiPassaggio di riferimenti adad oggetti oggetti non non remotiremoti

import java.rmi.*;

public interface RMIServer extends Remote {public void print(String s) throwsRemoteException;public Persona getOwner() throwsRemoteException;

}

Page 29: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

29

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5757 --

Riferimenti Riferimenti ad ad oggetti oggetti non remotinon remoti

public class Persona implements java.io.Serializable {protected String nome=null;protected String cognome=null;protected int eta=0;

public Persona(String _nome, String _cognome, int _eta) { nome=_nome; cognome=_cognome; eta=_eta; }public void parla() {

System.out.println("Sono una persona di"+eta+" anni");}

}

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5858 --

Serializzazione: cenniSerializzazione: cenni

Da rappresentazione in memoria a versione serializzata

Verdi

Giuseppe

99

oggetto: P2

Verdi Giuseppe 99string string int05412: XY

è una rappresentazione univoca di un oggetto con il proprio stato = può esser capita da un’altra JVM

Scrittura su file o invio su rete...

Classe: Persona

Stringcognome

Stringnome

inteta

P1 = new Persona(Verdi,Giuseppe,99);

Serializzazione

Page 30: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

30

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 5959 --

Passaggio di parametri e caricamento Passaggio di parametri e caricamento dinamico delle classidinamico delle classi

Uno dei principi di java è quello dello “zero deployment”

Quando si usa RMI è possibile scaricare dal sito del server:Gli stub degli oggetti remotiLe classi corrispondenti ai parametri

Per esempio, il client riceve un valore di ritorno da una chiamata remota che ha un certo tipo statico noto al client, ed un tipo dinamico non noto

Lo scaricamento è possibile anche dal client verso il serverAd esempio quando il server riceve un parametro che ha untipo statico noto e un tipo dinamico non notoIn questo caso occorre impostare la proprietàjava.rmi.server.codebase anche sul client

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6060 --

EsempioEsempio

Sul clientpublic class Uomo extends Persona {public Uomo(String _nome, String _cognome, int _eta) {

super(_nome, _cognome, _eta);}public void parla() {

System.out.println("Sono un uomo di "+eta+" anni");}}Sul serverpublic class Bambino extends Persona {public Bambino(String _nome, String _cognome, int _eta) {

super(_nome, _cognome, _eta);}public void parla() {System.out.println("Sono un bambino di "+eta+" anni");

}}

Page 31: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

31

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6161 --

Esempio: Esempio: Implementazione del serverImplementazione del server

public class RMIServerImpl extends UnicastRemoteObjectimplements RMIServer {

Persona persona = null;....

public void setOwner(Persona p) throws RemoteException {persona = p;

return;}public Persona getOwner() throws RemoteException {

Persona current = persona;persona = new Bambino("Giuseppe", "Garibaldi", 2);return current;

}}

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6262 --

Esempio: Esempio: Implementazione del clientImplementazione del client

public class ProvaRMIClient {public static void main(String[] args) {try {System.setSecurityManager( new RMISecurityManager());System.out.println("Looking up server...");ProvaRMIServer server = (ProvaRMIServer)

Naming.lookup("//"+args[0]+ "/ProvaRMIServer");System.out.println(server.getNumber());Uomo u = new Uomo("Giuseppe", "Verdi", 99);server.setOwner(u);Persona p = server.getOwner(); p.parla();p = server.getOwner(); p.parla();

} catch (Exception e) {e.printStackTrace();

} } }

Page 32: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

32

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6363 --

Contesto e motivazioni

Architettura e concetti di baseComponenti di RMIRMIRegistryInterfacce, eccezioni e classi

Lo sviluppo di una applicazioneL’esecuzione di una applicazione

Caricamento dinamico delle classiRMI e sicurezza

Il passaggio dei parametriL’utilizzo del registry

Indice degli argomentiIndice degli argomenti

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6464 --

Registrazione di oggetti remotiRegistrazione di oggetti remotisul Registry: Approfondimentisul Registry: Approfondimenti

JavaRMI fornisce un semplice Name Server tramite i cinque metodi statici della classe java.rmi.NamingIl Name Server di RMI è basato sull’Uniform Resource Locator (URL) del server dove si trovano gli oggetti remoti

Non fornisce trasparenza alla locazione degli oggettiIl Name Server è un processo (Registry) che deve essere lanciato sulle macchine da cui si vogliono esportare oggetti remotiIl Registry è un oggetto che realizza una mappa fra nomi (stringhe) ed identificatori di oggetti remoti

Page 33: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

33

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6565 --

Registrazione di oggetti remoti sul Registrazione di oggetti remoti sul RegistryRegistry

Quando il Name Server è stato attivato, tutte le applicazioni Java che intendono esportare oggetti remoti devono registrare tali oggetti presso il Registry, assegnando a ciascun oggetto un nome (operazione di bind)

Si può scegliere il numero di porta su cui lanciare il Registry (1099 di default), cosicché ogni processo server può utilizzare un proprio Registry, oppure un singolo registro può essere utilizzato per tutti gli oggetti su un hostE’ possibile utilizzare la classe java.rmi.registry.LocateRegistry e l’interfaccia java.rmi.registry.Registry per accedere da programma ad un registry o per crearne uno nuovo

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6666 --

La classe LocateRegistryLa classe LocateRegistry

public final class LocateRegistry {public static Registry getRegistry();// permette di ottenere un riferimento al registro sull’host corrente che è in attesa sulla porta di default (1099)public static Registry getRegistry(int port);// permette di ottenere un riferimento al registro sull’host corrente che è in attesa sulla porta passata come argomentopublic static Registry getRegistry(String host);// permette di ottenere un riferimento al registro sull’host passato come argomento che è in attesa sulla porta di default (1099)public static Registry getRegistry(String host, int port);// permette di ottenere un riferimento al registro sull’host passato come primo argomento che è in attesa sulla porta passata come secondo argomentopublic static Registry createRegistry(int port);// permette di creare un registro sull’host corrente e sulla porta specificata

}

Page 34: Programmazione Object Oriented in Java · 2011-12-16 · java.rmi.server.RemoteObject e dalle sue sottoclassi: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject RemoteObject

Java RMI

34

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6767 --

L’interfaccia del registryL’interfaccia del registry

public interface Registry extends java.rmi.Remote {public java.rmi.Remote lookup(String name); // restituisce l’identificatore dell’oggetto remoto legato al nome specificato

public void bind(String name, java.rmi.Remote obj);// memorizza nel registro il riferimento all’oggetto remoto passato come secondo parametro con un nome dato dal primo parametropublic void rebind(String name, java.rmi.Remote obj);// stessa operazione di bind: unica differenza risiede nel fatto che se un oggetto con lo stesso nome era già presente nel registro, viene scaricatopublic void unbind(String name);// rimuove il riferimento dell’oggetto con il nome specificato dal registro

public String[] list();// restituisce al chiamante la lista dei nomi degli oggetti presenti nel registro

}

Java RMIJava RMI © 2000 © 2000 -- Massimiliano PianciamoreMassimiliano Pianciamore-- 6868 --

BibliografiaBibliografia

G. Cornell, C. S. Horstmann. Core Java 2. SunSoft Press, Prentice Hall. 2nd edition, 1999.Java RMI Tutorial. Sun Microsystems, Inc. http://www.javasoft.comJava Remote Method Invocation Specification. Sun Microsystems, Inc., 1999. http://www.javasoft.com