Compute engine generici in RMI



Documenti analoghi
Compute engine generici in RMI

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

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

Corso di Reti di Calcolatori T

RMI: metodi equals e hashcode

RMI. Java RMI RMI. G. Prencipe

Esercizi RMI. Laboratorio di Programmazione di Rete A 5/12/2007. Esercitazione di Laboratorio

Corso di Reti di Calcolatori L-A

Laboratorio di Sistemi Distribuiti Leonardo Mariani

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

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

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

LPR 2005/2006 Lezione 7. paradigma di interazione domanda/risposta remote procedure call RMI (Remote Method Invocation): API JAVA esercizio

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Lezione n.10 LPR. RMI CallBacks

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

PROVA FINALE Ingegneria del software

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

Main System Monitor Keyboard

Esercizi su Callback RMI

Programmazione distribuita

Corso di Reti di Calcolatori LA

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

Esercizi su Java RMI. Progetto di Cliente / Servitore e supporto. Possibile tabella mantenuta dal server

GESTIONE DEI PROCESSI

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

Lezione n.10 LPR Informatica Applicata RMI Approfondimenti Callback. 15/05/2012 Laura Ricci

Sistemi Distribuiti Multiagente A.A Informatica Magistrale Università di Bari

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

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

Organizzazione della lezione. Lezione 16 Remote Method Invocation - 4. Modello Client Server. Le classi di Archivio Client-Server

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

Programmazione concorrente in Java

Remote Method Invocation (RMI)

Java threads (2) Programmazione Concorrente

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Java RMI: Esempio Completo di un Applicazione Distribuita

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:

Corso sul linguaggio Java

Multithreading in Java. Fondamenti di Sistemi Informativi

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Programmazione di sistemi distribuiti

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

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

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Esercizi della lezione 5 di Java

Lezione n.10. RMI CallBacks 9/12/2009 Andrea Corradini

Un esercizio d esame. Flavio De Paoli

Introduzione al linguaggio Java. Applicazioni ed Applets: come scriverli e farli girare. Caratteristiche originali e differenze con C / C++.

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

Lezione n.9 LPR Informatica Applicata Callbacks. Thread Miscellanea. 17/05/2010 Laura Ricci

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione

Corso di Laurea in Ingegneria Informatica. Corso di Reti di Calcolatori A.A. 2009/2010

Comunicazione fra oggetti distribuiti

RMI Remote Method Invocation

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

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

appunti delle lezioni Architetture client/server: applicazioni server

Laboratorio di Programmazione di Rete Corso A

Architettura MVC-2: i JavaBeans

Introduzione a Java Remote Method Invocation (RMI)

Multithreading/2. Più richieste servite simultaneamente > 1 thread per ogni connessione client (+ 1 thread per accettare nuove richieste).

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

Esercitazione sui Design Pattern

Architettura Client-Server

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Oggetti Distribuiti e Java RMI

ASD: Sistemi Distribuiti (Prof. Scarano) 20/05/2002

La concorrenza in Java package java.util.concurrent Antonio Furone

Organizzazione della lezione. 18. Applicazioni ed Esempi (2) II prova intercorso. Prove scritte degli esami successivi

13. Chain of Responsibility

Problema del buffer limitato. Lorenzo Gallucci

Organizzazione della lezione. Invocazione remota di metodi fai-da-te. Lezione 12 Introduzione a Remote Method Invocation

Corso di Reti di Calcolatori

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

18. Applicazioni ed Esempi (2)

Corso di Reti di Calcolatori. Datagrammi

Telematica II 17. Esercitazione/Laboratorio 6

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

TFA 42 Sistemi e Reti di Calcolatori per la Didattica

Corso di Reti di Calcolatori L-A

Socket & RMI Ingegneria del Software - San Pietro

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

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Corso sul linguaggio Java

Multithreading. Multithreading/2

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

Java Remote Method Invocation

15. Java Remote Method Invocation (3)

12. Java: Remote Method Invocation (3)

Corso di Reti di Calcolatori L-A

Lezione 5: Socket SSL/ TLS. Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno

Agenti Mobili in Java RMI

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

Sincronizzazione con Java

LEZIONE n.8 LPR REMOTE METHOD INVOCATION. 28/04/2008 Laura Ricci

Prova d Esame Compito A

Transcript:

Compute engine generici in RMI Esempio: Calcolo del prodotto scalare Un unico server offre il servizio di calcolo del prodotto scalare tra vettori di interi Un client richiede al server il calcolo del prodotto scalare

Esempio: Calcolo del prodotto scalare Interfaccia del servizio public interface ScalarProductService extends Remote { public int scalarproduct(int[] v1, int[] v2) throws RemoteException; Esempio: Calcolo del prodotto scalare Implementazione del servizio import java.rmi.server.*; public class ScalarProductServiceImpl extends UnicastRemoteObject implements ScalarProductService { public ScalarProductServiceImpl() throws RemoteException { super(); public int scalarproduct(int[] v1, int[] v2) throws RemoteException { int ret=0; for(int i=0;i<v1.length;i++) ret+=v1[i]*v2[i]; return ret;

Esempio: Calcolo del prodotto scalare Server public class ScalarProductServer { public static void main(string args[]) { try { ScalarProductServiceImpl spsi = new ScalarProductServiceImpl(); Naming.rebind("scalarProductService", spsi); System.out.println( "ScalarProductServer ready."); catch (Exception e) { System.out.println(e); Esempio: Calcolo del prodotto scalare Client import java.util.*; public class SimpleScalarProductClient { public static void main(string args[]) { int[] v1=new int[100]; int[] v2=new int[100]; for(int i=0;i<=99;i++) { v1[i]=i+1; v2[i]=1; int result=0;

Esempio: Calcolo del prodotto scalare Client try { ScalarProductService spe = (ScalarProductService)Naming.lookup( "rmi://localhost:1099/ scalarproductservice"); result=spe.scalarproduct(v1,v2); catch (Exception e) { System.out.println(e); System.out.println(result); Compute engine generico Ogni server che offre il servizio di calcolo generico implementa l interfaccia ComputeEngine ComputeEngine contiene un metodo execute per l esecuzione, con un certo set di parametri, di metodi specificati mediante un interfaccia Job Le classi che implementano l interfaccia Job ne particolarizzano il metodo run I client passano ai server istanze della classe Job e set di parametri (come java.lang.object) Il metodo Job.run è eseguito sui server

Compute Engine Job import java.io.*; public interface Job extends Serializable { public Object run(object parameters); Compute Engine Interfaccia public interface ComputeEngine extends Remote { public Object execute(job j, Object parameters) throws RemoteException;

import java.rmi.server.*; Compute Engine Implementazione public class ComputeEngineImpl extends UnicastRemoteObject implements ComputeEngine { public ComputeEngineImpl() throws RemoteException { super(); public Object execute(job j, Object parameters) throws RemoteException { return j.run(parameters); Compute Engine Server public class ComputeEngineServer { public static void main(string args[]) { try { ComputeEngineImpl cei = new ComputeEngineImpl(); Naming.rebind("computeEngine", cei); System.out.println( "ComputeEngineServer ready."); catch (Exception e) { System.out.println(e);

Compute engine generico I metodi remoti sono multithreaded per default Le loro invocazioni sono invece sincrone per i client Un client che suddivide il calcolo su più server deve perciò lanciare un thread per ogni invocazione di ComputeEngine.execute Anche la struttura di tali thread può essere resa generica Compute Engine Client thread class ComputeThread extends Thread { private Job job; private Object parameters; private String host; private Object result; public ComputeThread(Job job,object parameters, String host) { this.job=job; this.parameters=parameters; this.host=host; result=null;

Compute Engine Client thread public void run() { try { ComputeEngine ce = (ComputeEngine)Naming.lookup( "rmi://"+host+":1099/ computeengine"); result=ce.execute(job,parameters); System.out.println("ComputeThread result="+ result); catch (Exception e) { System.out.println(e); public Object getresult() { return result; Esempio: Calcolo del prodotto scalare /2 Un unico client utilizza un unico server generico Il client implementa Job creando ScalarProductJob, il cui metodo run effettua il prodotto scalare

Esempio: Calcolo del prodotto scalare /2 Job di calcolo import java.util.*; public class ScalarProductJob implements Job { public Object run(object parameters) { Vector v=(vector)parameters; Vector v1=(vector)v.get(0); Vector v2=(vector)v.get(1); int ret=0; for(int i=0;i<v1.size();i++) ret+=((integer)v1.get(i)).intvalue()* ((Integer)v2.get(i)).intValue(); return new Integer(ret); Esempio: Calcolo del prodotto scalare /2 Client di un unico engine import java.util.*; public class SimpleScalarProductCEClient { public static void main(string args[]) { Vector v1=new Vector(); Vector v2=new Vector(); for(int i=1;i<=100;i++) { v1.add(new Integer(i)); v2.add(new Integer(1)); int result=0;

Esempio: Calcolo del prodotto scalare /2 Client di un unico engine try { ComputeEngine ce = (ComputeEngine)Naming.lookup( "rmi://localhost:1099/computeengine"); Vector vpar=new Vector(); vpar.add(v1); vpar.add(v2); Integer res=(integer)ce.execute( new ScalarProductJob(),vpar); result=res.intvalue(); catch (Exception e) { System.out.println(e); System.out.println(result); Esempio: Calcolo del prodotto scalare /3 Un unico client utilizza 3 server generici Il client utilizza ScalarProductJob e suddivide i vettori in 3 sottovettori, assegnandone uno ad ogni server Il client lancia inoltre 3 thread per seguire il calcolo sui 3 sottovettori

Esempio: Calcolo del prodotto scalare /3 Client di engine multipli import java.util.*; public class ScalarProductCEClient { public static void main(string args[]) { Vector v1=new Vector(); Vector v2=new Vector(); for(int i=1;i<=100;i++) { v1.add(new Integer(i)); v2.add(new Integer(1)); Vector vpar1=new Vector(); vpar1.add(extract(v1,0,32)); vpar1.add(extract(v2,0,32)); ComputeThread ct1=new ComputeThread( new ScalarProductJob(),vpar1,"localhost"); Esempio: Calcolo del prodotto scalare /3 Client di engine multipli Vector vpar2=new Vector(); vpar2.add(extract(v1,33,66)); vpar2.add(extract(v2,33,66)); ComputeThread ct2=new ComputeThread( new ScalarProductJob(),vpar2,"localhost"); Vector vpar3=new Vector(); vpar3.add(extract(v1,67,99)); vpar3.add(extract(v2,67,99)); ComputeThread ct3=new ComputeThread( new ScalarProductJob(),vpar3,"localhost"); ct1.start(); ct2.start(); ct3.start();

Esempio: Calcolo del prodotto scalare /3 Client di engine multipli try { ct1.join(); ct2.join(); ct3.join(); catch (InterruptedException e) { System.out.println(e); System.out.println( ((Integer)ct1.getResult()).intValue()+ ((Integer)ct2.getResult()).intValue()+ ((Integer)ct3.getResult()).intValue()); Esempio: Calcolo del prodotto scalare /3 Client di engine multipli private static Vector extract(vector v, int from,int to) { Vector ret=new Vector(); for(int i=from;i<=to;i++) ret.add(v.get(i)); return ret;

Esempio: Calcolo del prodotto tra matrici Si vuole calcolare il prodotto tra matrici di dimensioni m n ed n r (nell esempio, 2 3 e 3 2) Un unico client utilizza m r server generici Il client utilizza sempre ScalarProductJob e assegna una coppia riga/colonna ad ogni server Il client lancia inoltre m r thread per seguire il calcolo di ognuno degli elementi della matrice risultato Esempio: Calcolo del prodotto tra matrici import java.util.*; public class MatrixProductCEClient { public static void main(string args[]) { int[][] mat1=new int[2][3]; int[][] mat2=new int[3][2]; int v=0; for(int i=0;i<mat1.length;i++) for(int j=0;j<mat1[0].length;j++) mat1[i][j]=++v; for(int i=0;i<mat2.length;i++) for(int j=0;j<mat2[0].length;j++) mat2[i][j]=(i==j?1:0);

Esempio: Calcolo del prodotto tra matrici Vector threads=new Vector(); for(int c=0;c<mat2[0].length;c++) for(int r=0;r<mat1.length;r++) { Vector vpar=new Vector(); vpar.add(extractcolumn(mat2,c)); vpar.add(extractrow(mat1,r)); ComputeThread ct=new ComputeThread( new ScalarProductJob(),vpar,"localhost"); threads.add(ct); for(int i=0;i<threads.size();i++) ((Thread)threads.get(i)).start(); Esempio: Calcolo del prodotto tra matrici try { for(int i=0;i<threads.size();i++) ((Thread)threads.get(i)).join(); catch (InterruptedException e) { System.out.println(e); int[][] result= new int[mat1.length][mat2[0].length]; for(int i=0;i<threads.size();i++) { int r=((integer)((computethread)threads.get(i)).getresult()).intvalue(); result[i%mat1.length][i/mat1.length]=r;

Esempio: Calcolo del prodotto tra matrici for(int i=0;i<result.length;i++) { System.out.println(); for(int j=0;j<result[0].length;j++) System.out.print(result[i][j]+" "); Esempio: Calcolo del prodotto tra matrici private static Vector extractrow(int[][] mat, int rowindex) { Vector ret=new Vector(); for(int c=0;c<mat[0].length;c++) ret.add(new Integer(mat[rowIndex][c])); return ret; private static Vector extractcolumn(int[][] mat, int columnindex) { Vector ret=new Vector(); for(int r=0;r<mat.length;r++) ret.add(new Integer(mat[r][columnIndex])); return ret;