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



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

Java Remote Method Invocation

RMI. Java RMI RMI. G. Prencipe

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

Socket & RMI Ingegneria del Software - San Pietro

Programmazione distribuita

RMI Remote Method Invocation

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Introduzione a Java Remote Method Invocation (RMI)

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

Telematica II 17. Esercitazione/Laboratorio 6

Esercitazione di Sistemi Distribuiti: Java RMI

Programmazione di sistemi distribuiti

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

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

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

Progettazione : Design Pattern Creazionali

appunti delle lezioni Architetture client/server: applicazioni client

RMI: metodi equals e hashcode

Main System Monitor Keyboard

Parte II: Reti di calcolatori Lezione 10

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

appunti delle lezioni Architetture client/server: applicazioni server

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

13. Chain of Responsibility

Programmazione dei socket con TCP #2

Programmazione a Oggetti Lezione 10. Ereditarieta

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

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

Inizializzazione degli Host. BOOTP e DHCP

Introduzione alle applicazioni di rete

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

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

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

Test di unità con JUnit4

GESTIONE DEI PROCESSI

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

Programmazione di rete in Java

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Comunicazione fra oggetti distribuiti

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Java: Compilatore e Interprete

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Corso di Informatica

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:

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Oggetti Lezione 3. aspetti generali e definizione di classi I

Scrivere un programma in Java

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

Esercizi della lezione 5 di Java

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

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Remote Method Invocation (RMI)

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione Orientata agli Oggetti in Linguaggio Java

Architettura MVC-2: i JavaBeans

Programmazione Java: Variabili membro, Metodi La parola chiave final

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

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

Java threads (2) Programmazione Concorrente

Programmazione in Java Parte I: Fondamenti

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

Esercitazione n 4. Obiettivi

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

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

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

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

Reti di Telecomunicazione Lezione 6

1 EJB e Portal Component Object

Algoritmi di Ricerca. Esempi di programmi Java

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

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Ingegneria del Software. Presentazione del pattern Proxy

DESIGN PATTERN CREAZIONALI INGEGNERIA DEL SOFTWARE INTRODUZIONE SINGLETON. Scopo dei design pattern creazionali

La sicurezza nel Web

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

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

Transcript:

Organizzazione della lezione 15. Java Remote Method Invocation (3) Vittorio Scarano Corso di Programmazione Distribuita Laurea di I livello in Informatica Università degli Studi di Salerno Il design pattern della factory in RMI Garbage collection distribuita Il logging dei metodi 2 Factory design pattern Lo schema del Factory Design Pattern - 1 Uno dei Design Patterns più comuni Una factory è un oggetto che controlla la creazione e/o l accesso ad oggetti Particolarmente utile in vari contesti: nel caso di oggetti remoti, permette la registrazione solamente della factory rendendo minimo l overhead di comunicazione con il registry permettendo il controllo (da parte del server) sul numero, tipo e qualità dei servizi offerti dal server 3 L oggetto Factory si registra sul registry Il Client ottiene un riferimento remoto alla Factory e chiede alla Factory di creare/dare accesso ad un oggetto Prodotto 4

Lo schema del Factory Design Pattern - 2 Alcuni requirements per RMI il cui riferimento remoto viene restituito al Client che può usarne i servizi Per usare il Factory Design Pattern in RMI sia la classe Factory che la classe Product devono avere una interfaccia remota che ne specifichi i servizi da usare da remoto Tra i servizi della Factory un metodo per avere un riferimento remoto di un Product Tra i servizi del Product i metodi per accedere ai servizi del Product 5 6 Un esempio per la Factory in RMI: RemoteHello Il solito servizio di saluto remoto Composto da una Factory di oggetti RemoteHello il cui riferimento viene passato al Client che può effettuare le chiamate richieste Due interface: una per specificare i servizi remoti offerti dalla Factory ottenere un riferimento remoto di un oggetto RemoteHello creato una per specificare i servizi remoti offerti da RemoteHello rispondere con una stringa di saluto 7 8

La interface remote: RemoteHello.java import java.rmi.remote; import java.rmi.remoteexception; /** * Interfaccia RemoteHello: la factory * @author Vittorio Scarano * @version 1.0 12/5/2002 */ public interface RemoteHello extends Remote { /** * Saluta il client, con il proprio nome * * @param parola tringa inviata dal client * @return una stringa di benvenuto! */ String dici(string parola) throws RemoteException; Import per uso delle interface Commenti per JavaDoc Unico metodo remoto lancia una eccezione remota 9 10 La interface remote: Factory.java import java.rmi.remote; import java.rmi.remoteexception; /** * Interfaccia per la factory di Remote Hello * @author Vittorio Scarano * @created 14 maggio 2002 * @version 1.0 12/5/2002 */ public interface Factory extends Remote { Remote dammiremoto(string nomeremoto ) throws RemoteException; Import per uso delle interface Commenti per JavaDoc Unico metodo remoto restituisce un oggetto la classe implementa Remote lancia una eccezione remota 11 12

La factory: FactoryImpl.java (1) import java.rmi.*; import java.rmi.server.*; public class FactoryImpl extends UnicastRemoteObject implements Factory { /* args[0] e' l'host su cui creare factory */ public static void main (String args[]) { System.setSecurityManager (new RMISecurityManager()); try { FactoryImpl f = new FactoryImpl ( "FactoryRemoteHello", args[0]); catch (Exception e) {System.out.println ("Eccezione:"+e); System.out.println ("Pronto!"); // end main // continua Server per Factory comprende il main() Set SM Creazione di una FactoryImpl passando l host come parametro 13 La factory: FactoryImpl.java (2) public FactoryImpl (String nome, String h) throws RemoteException{ super(); host = h; try { Naming.rebind( "rmi://"+host+"/"+nome,this); catch (Exception e) {System.out.println ("Eccezione:"+e); // fine costruttore public Remote dammiremoto (String nomeremoto) throws RemoteException { RemoteHelloImpl rh = new RemoteHelloImpl("RemoteHello", host, nomeremoto); return rh.dammiremotereference(); private String host; Costruttore costruttore di UnicastRemoteObject Bind sul registry con il nome passato Metodo remoto factory: istanzia un RemoteHello con il nome passato dal client restituisce il suo riferimento remoto Variabile istanza: host 14 15 Il servizio remoto: RemoteHelloImpl.java (1) import java.rmi.*; import java.rmi.server.unicastremoteobject; public class RemoteHelloImpl extends UnicastRemoteObject implements RemoteHello { public RemoteHelloImpl (String nome, String host, String id) throws RemoteException{ super(); try { Naming.rebind ("rmi://"+host+"/"+nome,this); myid = id; remotereference = Naming.lookup (nome); catch (Exception e) {System.out.println ("Ecc.:"+e); // fine costruttore continua Import per uso delle interface e superclasse Costruttore chiamata costruttore di UnicastRemoteObject bind sul registry setting delle variabili istanza id dato dal Client riferimento remoto 16

Il servizio remoto: RemoteHelloImpl.java (2) public String dici (String parola) throws RemoteException { System.out.println(myid+": Ricevuto "+ parola); return ("Sono "+myid+" e ti saluto!"); public Remote dammiremotereference() { return remotereference; private String myid; private Remote remotereference; Implementazione metodo remoto restituisce anche l id Metodo locale serve per la Factory per prelevare il riferimento remoto Variabili istanza stringa di ID riferimento remoto 17 18 Il client: Client.java (1) Il funzionamento del programma import java.rmi.*; import java.rmi.registry.*; import java.rmi.server.*; public class Client { public static void main (String args[]) { System.setSecurityManager (new RMISecurityManager()); try { Factory fact = (Factory) Naming.lookup ( "rmi://"+args[0]+"/factoryremotehello"); RemoteHello hello = (RemoteHello) fact.dammiremoto(args[1]); System.out.println(hello.dici ( Ecco!")); catch (Exception e) { System.out.println("Eccezione"+e); Parametri del main host del Factory nome del client Set SM Ricerca della Factory Chiede un riferimento ad un oggetto di RemoteHello Chiama il metodo remoto 19 $ java FactoryImpl localhost Pronto! Pippo: ricevuto Ecco! RemoteHelloImpl riferimento FactoryImpl $ java Client localhost Pippo Sono Pippo e ti do il benvenuto $ dici( Ecco! ) dammiremoto() Client hello 20

Organizzazione della lezione La Garbage Collection Il design pattern della factory in RMI Due filosofie nei linguaggi di programmazione Garbage collection distribuita Il logging dei metodi La filosofia C: La gestione della memoria è troppo importante per essere gestita dal sistema La filosofia Smalltalk (e Java) La gestione della memoria è troppo importante per essere gestita dal programmatore Vediamo un esempio della garbage collection in locale 21 22 Esempio di Garbage Collection Garbage Collection distribuita - 1 public class Garbage { public static void main(string args[ ]) { String s; s = new String( Ciao ); s = s + " Vittorio"; // chiamiamo il garbage collector System.gc(); System.out.println(s); return; Allochiamo un oggetto stringa Ciao riferito dalla variabile s Concateniamo questa stringa ad una altra stringa la variabile s adesso punta ad un nuovo oggetto stringa Ciao Vittorio quindi la chiamata al garbage collector la elimina Se scrivere un algoritmo (ed implementarlo) per la Garbage Collection di oggetti locali è difficile scriverlo per oggetti distribuiti è davvero improbo La politica di Java RMI ereditata dalla politica degli oggetti di Modula 3 Ogni JVM mantiene il conto dei riferimenti remoti che referenziano un oggetto 23 24

Garbage Collection distribuita - 2 Garbage Collection distribuita - 3 Quando l ultimo riferimento viene eliminato, il riferimento diventa weak possibile eliminare l oggetto se non esistono riferimenti locali all oggetti E possibile la interazione con il GC distribuito: Se un oggetto implementa la interface java.rmi.server.unreferenced deve implementare il metodo unreferenced() che viene chiamato quando l ultimo riferimento live viene eliminato 25 Quando un client ottiene un riferimento remoto il DGC considera l oggetto come dirty affidando però un lease (fitto) per una durata di tempo determinata settabile con la proprietà java.rmi.dgc.leasevalue (in millisecondi) al termine del quale il riferimento viene considerato weak e quindi l oggetto può essere collezionato dal GC E responsabilità del client rinnovare il lease e considerare nel codice (attenzione!) la possibilità che per qualche problema sulla connessione, l oggetto remoto non ci sia più 26 Implementazione del DGC Il metodo dirty() Implementa una interface java.rmi.dgc che eredita da Remote Due metodi: dirty() e clean() Le chiamate a dirty() vengono effettuate dal client quando una reference remota viene unmarshaled sono chiamate remote nascoste nel meccanismo di RMI Le chiamate a clean() vengono fatte dal client quando non esistono più riferimenti remoti all oggetto public Lease dirty(objid[ ] ids, long sequencenum, Lease lease) throws RemoteException ObjID sono assegnati dal server agli oggetti remoti unici sequencenum serve per scartare eventuali chiamate giunte in ritardo lease contiene un identificatore unico per la JVM del client (VMID) ed un periodo richiesto viene restituito un lease 27 28

L identificazione dei client: il VMID Organizzazione della lezione Una classe che permette di costruire identificatori univoci per una macchina virtuale Java basato anche su IP address della macchina reale In alcuni casi, quindi, non può essere generato se, ad esempio, per sicurezza non viene permesso l accesso a questa informazione Requisiti per la univocità stessi requisiti di java.rmi.server.uid (ID uniche su JVM) host che non fa il reboot in un millisecondo e il cui clock non viene mai messo all indietro Il design pattern della factory in RMI Garbage collection distribuita Il logging dei metodi indirizzo IP unico e costante per la durata dell oggetto 29 30 Logging delle chiamate Uso del logging per RMI Possibile chiedere alla JVM di effettuare il logging delle chiamate nascoste di RMI Mediante passaggio di parametri su linea di comando alla JVM meccanismo che integra la capacità di costruire oggetti logger fornite da JDK 1.4 che permette di effettuare logging in testo o formattato verso la memoria, stream di output, console, file e socket Offerto (in maniera minimale) da RMI package java.rmi Implementato (in maniera vendor-specific) da SUN package sun.rmi Possibile monitorare sia il server (RMI) che il client (SUN) scegliere il dettaglio (tra SILENT, BRIEF, VERBOSE) Nei log compaiono, tra l altro dettagli sulle chiamate al registry per bind e lookup dettagli sulle chiamate remote effettuate dettagli sulle chiamate per il Distributed Garbage Collector 31 32

Come usare il logging: le proprietà Il funzionamento del log lato server java.rmi.server.logcalls logging effettuato lato server verso System.err sun.rmi.server.loglevel controlla il livello di log, può assumere valori di SILENT, BRIEF e VERBOSE sun.rmi.client.logcalls logging effettuato lato client. 33 C:\Sincronia File\Asdsd\Progetti\FactoryExample>java -Djava.security. policy=policyall -Djava.rmi.server.logCalls=true -Dsun.rmi.server.logLevel=Brief FactoryImpl localhost 15-mag-2002 18.49.08 sun.rmi.server.unicastref newcall FINE: main: get connection 15-mag-2002 18.49.11 sun.rmi.server.unicastserverref logcall MOLTO FINE: RMI TCP Connection(1)-10.0.0.201: [10.0.0.201: sun.rmi.transport.dgc Impl[0:0:0, 2]: java.rmi.dgc.lease dirty(java.rmi.server.objid[], long, java.rmi.dgc.lease)] 15-mag-2002 18.49.11 sun.rmi.server.unicastref done FINE: main: free connection (reuse = true) Pronto! 15-mag-2002 18.53.10 sun.rmi.server.unicastserverref logcall MOLTO FINE: RMI TCP Connection(2)-10.0.0.201: [10.0.0.201: sun.rmi.transport.dgc Impl[0:0:0, 2]: java.rmi.dgc.lease dirty(java.rmi.server.objid[], long, java.rmi.dgc.lease)] 15-mag-2002 18.53.10 sun.rmi.server.unicastserverref logcall MOLTO FINE: RMI TCP Connection(2)-10.0.0.201: [10.0.0.201: FactoryImpl[0]: publi c abstract java.rmi.remote Factory.dammiRemoto(java.lang.String) throws java.rmi.remoteexception] 15-mag-2002 18.53.10 sun.rmi.server.unicastref newcall FINE: RMI TCP Connection(2)-10.0.0.201: get connection 15-mag-2002 18.53.10 sun.rmi.server.unicastserverref logcall MOLTO FINE: RMI TCP Connection(3)-10.0.0.201: [10.0.0.201: sun.rmi.transport.dgc Impl[0:0:0, 2]: java.rmi.dgc.lease dirty(java.rmi.server.objid[], long, java.rmi.dgc.lease)] 15-mag-2002 18.53.10 sun.rmi.server.unicastref done. Pippo: Ricevuto Finalmente! 34 Il funzionamento del log lato client (1) Il funzionamento del log lato client (2) C:\Sincronia File\Asdsd\Progetti\FactoryExample>java -Djava.security.policy=poli cyall -Dsun.rmi.client.logCalls=true -Dsun.rmi.client.logLevel=BRIEF Client loca lhost Pippo 15-mag-2002 19.06.27 sun.rmi.server.unicastref logclientcall MOLTO FINE: main: outbound call: [endpoint:[localhost:1099](remote),objid:[0:0:0, 0]] : sun.rmi.registry.registryimpl_stub[0:0:0, 0]: java.rmi.remote lookup(jav a.lang.string) 15-mag-2002 19.06.29 sun.rmi.server.unicastref logclientcall MOLTO FINE: main: outbound call: [endpoint:[10.0.0.201:1320](remote),objid:[0:0: 0, 2]] : sun.rmi.transport.dgcimpl_stub[0:0:0, 2]: java.rmi.dgc.lease dirty(java.rmi.server.objid[], long, java.rmi.dgc.lease) 15-mag-2002 19.06.29 sun.rmi.server.unicastref invoke MOLTO FINE: main: method: public abstract java.rmi.remote Factory.dammiRemoto(ja va.lang.string) throws java.rmi.remoteexception 15-mag-2002 19.06.29 sun.rmi.server.unicastref logclientcall MOLTO FINE: main: outbound call: [endpoint:[10.0.0.201:1320](remote),objid:[f336 75:edd5086870:-8000, 0]] : FactoryImpl_Stub[f33675:edd5086870:-8000, 0]: public abstract java.rmi.remote Factory.dammiRemoto(java.lang.String) throws java.rmi.r emoteexception 15-mag-2002 19.06.30 sun.rmi.server.unicastref logclientcall MOLTO FINE: main: outbound call: [endpoint:[10.0.0.201:1320](remote),objid:[0:0: 0, 2]] : sun.rmi.transport.dgcimpl_stub[0:0:0, 2]: java.rmi.dgc.lease dirty(java.rmi.server.objid[], long, java.rmi.dgc.lease) 15-mag-2002 19.06.30 sun.rmi.server.unicastref invoke. MOLTO FINE: main: method: public abstract java.lang.string RemoteHello.dici(java.lang.String) throws java.rmi.remoteexception 15-mag-2002 19.06.30 sun.rmi.server.unicastref logclientcall MOLTO FINE: main: outbound call: [endpoint:[10.0.0.201:1320](remote),objid:[f336 75:edd5086870:-8000, 2]] : RemoteHelloImpl_Stub[f33675:edd5086870:-8000, 2]: pub lic abstract java.lang.string RemoteHello.dici(java.lang.String) throws java.rmi.remoteexception Sono Pippo e ti do' il benvenuto C:\Sincronia File\Asdsd\Progetti\FactoryExample> 35 36