La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Generazione di codice dinamico per la realizzazione di catene di servizi componibili Matteo Fazi – matr. 0000260636.

Presentazioni simili


Presentazione sul tema: "Generazione di codice dinamico per la realizzazione di catene di servizi componibili Matteo Fazi – matr. 0000260636."— Transcript della presentazione:

1 Generazione di codice dinamico per la realizzazione di catene di servizi componibili
Matteo Fazi – matr

2 Obiettivi del progetto
Composizione di servizi “off-the-shelf” Catene di servizi La composizione dei servizi deve avvenire “a caldo”: Sistema dinamico per la creazione di nuove catene Efficienza nella composizione Trasparenza nell'invocazione di catene mai richieste in precedenza Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

3 Contesto applicativo L'ambito applicativo è Java EE 5
Il progetto sfrutta il supporto del Container JBoss I servizi sono i metodi invocabili su EJB Per ogni servizio (metodo) è disponibile: La signature del metodo La relativa interfaccia Java Il nome JNDI dell'EJB che implementa il metodo Indirizzo e porta del servizio JNDI Queste informazioni sono salvate in un oggetto denominato Brick Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

4 Come creare dinamicamente le catene?
Soluzione basata unicamente sul supporto alla reflection offerto da Java Pro: semplice realizzazione Contro: inefficiente Soluzione basata sulla creazione “a caldo” di codice sorgente della catena e successiva compilazione Contro: inefficiente; complessità realizzativa Soluzione basata sulla creazione diretta del bytecode della catena Pro: efficiente Contro: complessità realizzativa Framework ASM Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

5 Processo di invocazione
Quando viene richiesta l'invocazione di una catena: Se la catena è stata generata in precedenza: il bytecode viene caricato mediante il ClassLoader dell'applicazione Se la catena NON è stata generata in precedenza: Vengono recuperati i Brick relativi ai servizi Dai Brick viene generato il bytecode della catena Il bytecode viene salvato su supporto persistente La catena viene posta in esecuzione Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

6 Architettura del sistema
Executor: accetta le richieste di esecuzione delle catene Coordinator: coordina le attività di Executor e ASMBlackSmith ClassLoader: carica il bytecode relativo alle catene BrickManager: gestisce i Brick (registrazione/modifica/elimin azione) ASMBlackSmith: genera il bytecode relativo alle catene Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

7 Struttura di una Catena
Implementa il metodo execute Composta da due parti Parte “invariante”: comportamento indipendente dai servizi Parte “variabile”: dipende dai servizi Il sistema genera il bytecode relativo alla sola parte “variabile” Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

8 Alcuni dettagli Le nuove catene sono anch'esse EJB
La parte invariante è annotata Al momento dell'invocazione il container deve disporre delle interfacce dei servizi Possibilità di fare il deploy delle catene in altri container Il sistema su richiesta genera un file .jar contenente le interfacce dei servizi, l'interfaccia IChain e la catena generata Il bytecode viene salvato su supporto persistente Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

9 ClassLoader Per porre in esecuzione il bytecode delle catene è necessario crearne una nuova istanza A partire dal nome della catena viene recuperato il relativo bytecode Il bytecode è contenuto in oggetti di tipo Class Per ottenere una nuova istanza viene invocato Class.newInstance() Viene effettuato il cast a IChan Infine viene invocato il metodo execute() Class bytecode = _loader.loadClass(chainName); IChain chain = (IChain)bytecode.newInstance(); Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

10 Alcuni problemi L'approccio appena descritto va contro la politica di gestione dei tipi di Java Due istanze della stessa classe caricate da due ClassLoader differenti sono considerate differenti Nel sistema è presente la stessa situazione Caricata dal ClassLoader cl1 org.package.FooBar foo = new org.package.FooBar(); org.pagacke.FooBar bar = (org.package.FooBar) foo; ClassCastException Caricata dal ClassLoader cl2 Caricata dal ClassLoader cl2 Caricata dal ClassLoader dell'applicazione Class bytecode = _loader.loadClass(chainName); IChain chain = (IChain)bytecode.newInstance(); Caricata dal ClassLoader del Container Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

11 Soluzione Il ClassLoader dell'applicazione deve utilizzare (forzare) il ClassLoader del container per caricare le classi prodotte Rendere “momentaneamente” pubblico il metodo protected defineClass() attraverso la reflection Class cls = Class.forName( "java.lang.ClassLoader" ); method = cls.getDeclaredMethod( "defineClass", new Class[] {String.class, byte[].class, int.class, int.class} ); method.setAccessible( true ); Object[] args = new Object[] {name, clazzBytes, new Integer( 0 ), new Integer( clazzBytes.length )}; clazz = (Class) method.invoke( this.getParent(),args ); Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

12 Soluzione La soluzione adottata è contro i principi base dei linguaggi ad oggetti Guadagno in termini di efficienza Le chiamate introspettive sono confinate alla prima richiesta di esecuzione di una catena Le successive esecuzioni della stessa catena recuperano il bytecode da una cache presente nel ClassLoader (no introspezione) Tale soluzione è consigliata anche dagli sviluppatori di ASM Generazione di codice dinamico per la realizzazione di catene di servizi componibili.

13 Conclusioni e sviluppi futuri
Attenzione ai requisiti di trasparenza e di efficienza sia a regime sia in fase di creazione e caricamento delle catene Sviluppi futuri: Sicurezza Linguaggio di composizione Aumento del parallelismo nell'esecuzione delle varie fasi Generazione di codice dinamico per la realizzazione di catene di servizi componibili.


Scaricare ppt "Generazione di codice dinamico per la realizzazione di catene di servizi componibili Matteo Fazi – matr. 0000260636."

Presentazioni simili


Annunci Google