ESERCITAZIONE TIGA: RMI, unico host, caricamento locale delle
Transcript
ESERCITAZIONE TIGA: RMI, unico host, caricamento locale delle
ESERCITAZIONE TIGA: RMI, unico host, caricamento locale delle classi Un Conto bancario è caratterizzato esclusivamente da un nome ed un saldo. Il nome identifica univocamente un Conto, tra gli oggetti istanziati. Un oggetto di classe Conto viene implementato come un oggetto remoto, ossia con (alcuni) metodi invocabili da applicazioni in esecuzione su altre JVM (inizialmente supposte, per semplicità, residenti su un unico host) tramite l’interfaccia remota Conto (Fig.1): public interface Conto extends Remote { void versa(double importo) throws RemoteException; void preleva(double importo throws RemoteException, NegativeAmountException; double ritornaSaldo() throws RemoteException; } Nella creazione dell’oggetto ContoImpl, si definisce il nome dell’oggetto e si imposta il saldo iniziale al valore zero. Il nome del conto viene anche adoperato come nome pubblico per registrare l’oggetto Conto presso l’RMI Registry. PROGETTARE E REALIZZARE: • La classe ContoImpl, implementazione thread-safe dell’ interfaccia. A tale scopo, si dichiarino semplicemente i metodi come synchronized per garantire un accesso mutuamente esclusivo. • La classe ContoServer, che implementa il programma server in accordo alle seguenti specifiche: i) crea (ed esporta) un insieme di conti, dai nomi passati da riga di comando; ii) li registra presso l’RMI Registry. Fig. 1 – Diagramma delle Classi. • La classe ContoClient, che implementa il programma client in accordo alle seguenti specifiche: i) riceve nome, importo1 ed importo2 come parametri di ingresso, da riga di comando; ii) recupera un oggetto di classe ContoImpl_Stub (che funge da proxy per l’oggetto ContoImpl residente sul server) con tale nome, e lo riferisce con un riferimento interfaccia conto. iii) invoca remotamente i seguenti metodi: conto.versa(importo1); conto.preleva(importo2); System.out.println(conto.ritornaSaldo()); • La gestione delle seguenti eccezioni: NotBoundException e java.net.MalformedURLException (metodo Naming.lookup ), RemoteException (metodi dell’ interfaccia Conto), AlreadyBound Exception (metodo Naming.bind), NegativeAmountException (classe eccezione sviluppata “ad hoc” per intercettare un prelievo superiore al saldo, quindi sollevata dal metodo Conto.preleva). Fig. 2 – Diagramma di distribuzione dei componenti. SUGGERIMENTI: • Compilare tutti i sorgenti (javac *.java) in un’ unica cartella, successivamente produrre la classe stub mediante l’applicazione rmic della directory bin (rmic –v1.2 ContoImpl), e distribuire il bytecode in tre cartelle, RMIregistry, RMIserver ed RMIclient, come indicato in Fig.1-a e Tab.1. compile time run time Tab. 1 – Moduli necessari ad ogni sottosistema, a compile e run time. ContoServer ContoClient server, interfaccia remota e relativa client, interfaccia remota, altre classi implementazione, altre classi adoperate (da adoperate (da questi moduli). questi moduli). server, interfaccia remota e relativa client, interfaccia remota, altre classi implementazione, altre classi adoperate, stub adoperate, stub. RMI Registry interfaccia, altre classi adoperate, stub. • Adoperare l’applicazione rmiregistry della directory bin, digitando rmiregistry 1099 1 per far partire l’RMI Registry, prima del client e del server, dalla cartella RMIregistry. • Avviare i processi ContoServer e ContoClient dai rispettivi percorsi (quindi su JVM differenti). • In ContoClient passare come parametro di ingresso anche l’host di residenza del registry, in modo da costruire, per il metodo lookup, una URL come nel seguente esempio //10.114.109.11:1099/pippo2. 1 2 Se vi sono problemi di connettività con RMIRegistry, provare a cambiare porta (es. 1100, 1101,...). Cerca l’oggetto pippo nel registry che risiede in 10.114.109.11 sulla porta di default 1099). pagina 1 di 1