



Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Introduzione alla programmazione distribuita con spiegazione del funzionamento di Java RMI e linee guida per la creazione di un sistema distribuito in java RMI
Tipologia: Sbobinature
1 / 5
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!




A differenza della programmazione orientata agli oggetto dove gli oggetti con i suoi metodi potevano essere invocati solo localmente quando parliamo di programmazione distribuita ad oggetti, vogliamo dire che gli oggetti con i suoi metodi possono essere invocati remotamente dunque, non per forza devono essere presenti sulla nostra macchina ma, possono trovarsi anche su altre macchine. Naturalmente, deve esistere una connessione tra chi invoca il metodo remotamente e chi lo fornisce
Le risorse disponibili in una connessione di rete sono viste come oggetti distribuiti dove: i metodi relaviti ad un oggetto distribuito sono detti metodi remoti; se, invece, si fa riferimento ad un oggetto locale parleremo di metodo locale
L’architettura utilizzata per rendere possibile la programmazione distribuita si basa su una architettura client - server composta, in particolare, da tre elementi fondamentali: Object Client, Object Server e, Object Registry Dal punto di vista logico abbiamo che:
L’invocazione di un metodo in un sistema distribuito è detta: Remote Procedure Call (RPC) dove, la chiamata è invocata da un processo all’altro e, i dati sono passati come argomenti della procedura. Ciò che accade fisicamente nell’architettura è:
Marshalling e Unmarshalling
Le operazione di marshalling e unmarshalling sono fondamentali per il paradigma della programmazione distribuita infatti, l’operazione di marshalling consente di trasformare i dati da traferire in un flusso di byte che può viaggiare sulla rete mentre, l’operazione di unmarshalling non fa altro che l’operazione contraria permette, preso il pacchetto di risalire ai dati
1.2 Java RMI
L’obbiettivo di Java RMI è quello di estendere il modello Java Object per supportare la programmazione con oggetti distribuiti, rendendola più semplice possibile. I principali componenti che Java RMI utilizza sono:
Per supportare la programmazione distribuita, java RMI fa uso di tecnologie di supporto quali:
Si nota, come Java RMI è basato sulle interfacce. Tutti gli oggetti remoti devono implementare l’interfaccia ja- va.rmi.Remote. L’interfaccia risiede lato Client mentre, lato Server abbiamo l’implementazione infatti, è sul server che viene eseguito il programma
Componenti
Implementazione
In alcune architetture RMI può essere utile rendere il Client anche un Server, così che il Client non possa accedere ad oggetti remoti ma, possa anche caricare dei propri oggetti sull’RMI registry. Il meccanismo è detto CallBack, in particolare, si fa uso delle Cliet CallBack, ciò permette al Client di essere notificato da un server per un evento che il Client stesso aspettava; questa notifica non è altro che l’invocazione da parte del Server di un metodo remoto sul Client.
Per far ciò, lasciare che il Client estenda la classe java.rmi.server.UnicastRemoteObject sarebbe poco opportuno quindi, l’oggetto del Client viene reso "remoto" chiamando il metodo statico UnicastRemoteObject.exportObject(obj)
Per rendere disponibile il meccanismo è necessario:
Lato Server
Mantenere un riferimento al Client sul quale effettuare il CallBack quindi, oltre a fare tutto ciò che facevamo prima per il server, bisogna aggiungere, tra i metodi remoti quello che il client invocherà per inviare il riferimento sul quale verrà fatta la callback
Lato Client
Bisogna fornire il metodo remoto che il Server invocherà per eseguire la CallBack. Quindi:
Per quanto riguarda un sistema distribuito, la sicurezza riguarda un argomento molto importante perché la macchina Client dovrà fare il download di codice per avere lo stub di oggetti remoti Tutti i vari download sono gestiti e controllati da un Security manager che agisce le rispetto di policy specificate in un file di testo chimato security policy. In tal modo il security manager controlla il codice dello stub e ne verifica che rispetta le regole stabilite nel file di policy prima di scaricare il codice
File di policy
Il file di policy usato in RMI specifica quale codice scaricato da un codebase è permesso per il download. Un codabase è un’insieme di classi che servono per accedere ad un oggetto remoto, che quindi, devono essere scaricate se si fa uso di quell’oggetto. Il file di policy può essere settato direttamente dal codice del programma tramite il metodo System.setProperty()
Il file è composto da blocchi di grant e, ogni blocco di grant specifica i permessi per un codebase Es. grant{...}
Security Manager
Se il security manager non viene settato, il file di policy viene ignorato. Quindi, è importantissimo settare il security manager. Il security manager può essere dichiarato esplicitamente nel codice usando il metodo System.setSecurityManager(new RMISecurityManager()) e, ciò deve essere fatto in tutte le applicazioni che hanno bisogno di scaricare codice
Una caratteristica della piattaforma Java RMI è la possibilità di scaricare dinamicamente il codice di delle classe ed eseguirle. Il codebase di classi da scaricare sono identificate da un URL, attraverso esso si specifica il percorso da seguire per scaricare il codebase. Una volta noti i file bisogna assicurasi che essi siano disponibili al class loader di ogni JVM
Ciò è fatto normalente in una applicazione RMI per scaricare i file delle classi di supporto all’applicazione per gli oggetti remoti, di cui il Client non ne conosce l’esistenza
Nelle ultime versione, i progettisti RMI hanno esteso il concetto di class loading, includendo il caricamento di classi da server HTTP; l’URL del codebase è quindi definito in modo tale da specificare dove si trovano le classi di cui ha bisogno la JVM
Come era stato introdotto un garbage collector per la versione standard di java, che permette di liberare spazio di memoria occupato da dati non più utilizzati, anche nella versione RMI è stato fornito un distibuted garbage collector
Il Distributed garbage collector è basato sulla tecnica del reference counting. In questo caso, è il Server a mantenere il conteggio dei riferimenti mentre, compito del Client è quello di avvertire quando stabilisce un riferimento ad un oggetto e, poi quando si libera di quel riferimento. Il DGC è esso stesso un server che implementa l’interfaccia remota java.rmi.dgc. L’interfaccia offre due metodi:
Quando il contatore di un oggetto si azzera vuol dire che l’oggetto remoto sarà libero da qualsiasi Client; l’oggetto viene messo nella weak reference list per poi essere eliminato