spring e flex
DESCRIPTION
Una panoramica sulle diverse possibilità offerte da Spring per applicazioni RIA realizzate in Flex: Spring sul server per l'implementazione di un backend con serializzazione nativa AMF3 con Spring BlazeDS integration, Spring sul client con Spring ActionScript e Spring come usato dallo streaming server opensource Red5 per la realizzazione di applicazioni video. Presentazione tenuta allo Spring Framework Meeting di Settembre 2009 a Cagliari.TRANSCRIPT
![Page 1: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/1.jpg)
Spring & Flex
Marcello [email protected]
Java User Group Milanohttp://www.jugmilano.it
Spring Meeting Settembre 2009 - Cagliari
![Page 2: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/2.jpg)
Spring Meeting Settembre 2009 2
Di cosa parleremo?
● Introduzione a RIA● Flex● BlazeDS● Spring BlazeDS Integration● Spring ActionScript● Red5
![Page 3: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/3.jpg)
Spring Meeting Settembre 2009 3
Due parole sullo speaker
● Coordinatore del JUG Milano● Moderatore SpringFramework-IT● Moderatore Gruppo Italiano Utenti Groovy● Socio e CTO in ExcogitaNet● più twitterer: http://twitter.com/magomarcelo
che blogger: http://magomarcelo.blogspot.com● Prima presentazione su RIA a Java Conference '05● Speaker ad All4Web, evento RIA cross-community
![Page 4: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/4.jpg)
Spring Meeting Settembre 2009 4
Definizione di Rich Internet Application
"web applications have extended the reach of enterprises to customers, offering anywhere and anytime access. However, this has
been at the expense of the overall user-experience, which is diminished by delivery through the web browser"
Steven Webster e Alistair McLeod,autori del libro Flex Integration with J2EE, 2005
http://www.theserverside.com/articles/article.tss?l=Flex→ un nuovo tipo di web application che ne superi i limiti?
Caratteristiche:● web deployment● logica applicativa suddivisa fra client e server● interazione immediata senza percezione di un roundtrip sul server● accesso a contenuti rich: audio/video
![Page 5: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/5.jpg)
Spring Meeting Settembre 2009 5
Architettura di Riferimento
![Page 6: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/6.jpg)
Spring Meeting Settembre 2009 6
Client Runtime
La scelta del runtime:● JVM/JavaFX
Il ritorno delle Applet in una veste più adatta al mondo RIA. Estensione sul desktop tramite Java WebStart.
● AJAXMagia tramite JavaScript e XMLHttpRequest. Estensione sul desktop tramite soluzioni browser-embedded come Prism.
● Flash/FlexBrowser plugin per animazioni vettoriali, via via arrichitosi nelle versioni recenti di funzionalità applicative.Estensione sul Desktop tramite il runtime AIR.
● SilverlightBrowser plugin che implementa una versione ridotta del runtime di .NET con funzioni GUI e media avanzate.
![Page 7: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/7.jpg)
Spring Meeting Settembre 2009 7
Backend
Qual è il backend più adatto per le RIA?
Va bene qualsiasi soluzione di esportazione remota su internet di servizi, purché esponga le proprie funzionalità in:● XML over HTTP (ReST)● web service “standard” SOAP● formati “nativi” in base al runtime scelto
– Java Serialization Protocol ed RMI over HTTP per JVM– AMF3 per Flash– JSON per AJAX
![Page 8: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/8.jpg)
Spring Meeting Settembre 2009 8
Elementi di scelta per backend RIA
● Modalità di remoting già supportate dal runtime o disponibili tramite librerie aggiuntive o sviluppo custom
● Serializzazione dati nativa o parsing● Compromesso fra effort di implementazione
e performance, intesa come tempo di processing lato client e dati scambiati su rete
![Page 9: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/9.jpg)
Spring Meeting Settembre 2009 9
Benchmarkinghttp://www.jamesward.com/census/
![Page 10: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/10.jpg)
Spring Meeting Settembre 2009 10
La Flash Platform di Adobe
![Page 11: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/11.jpg)
Spring Meeting Settembre 2009 11
Flex in dettaglio● Flash/AIR
Runtime web e desktop per Windows/Mac/Linux.● ActionScript 3
linguaggio ad oggetti ECMA3 analogo a JavaScript introdotto con Flash versione 9
● Flex SDK opensource– framework componenti grafici (e non solo)– linguaggio dichiarativo MXML duale di AS3– compilatore mxmlc da MXML e AS3 a SWF– task per ant (per Maven vedi FlexMojos)
● Flex (ora Flash) Builder IDE commercialeambiente di sviluppo per Flex basato su Eclipse
![Page 12: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/12.jpg)
Spring Meeting Settembre 2009 12
BlazeDS
● Cos'è?Soluzione “ufficiale” di Adobe per la realizzazione di backend in Java per applicazioni Flex
● Nasce come prodotto server commerciale con nome Flex Data Services, a JavaPolis 2007 viene presentato in versione opensource con nome BlazeDS insieme alla sua estensione commerciale LiveCycle Data Services.
![Page 13: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/13.jpg)
Spring Meeting Settembre 2009 13
Cosa offre BlazeDS?
![Page 14: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/14.jpg)
Spring Meeting Settembre 2009 14
Come si configura BlazeDS● il file principale è services-config.xml che
include a sua volta:– remote-services.xml per remoting– messaging-services.xml per publish-subscribe– proxy-services.xml per proxying SOAP/HTTP
in assenza di file crossdomain.xml● contiene le configurazioni delle destination che
identificano i servizi di backend con i quali interagisce il client Flex
● ad ogni destination è associato una configurazione di un adapter verso l'implementazione del servizio
![Page 15: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/15.jpg)
Spring Meeting Settembre 2009 15
RemoteObject Flex API
<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:RemoteObject id="ro" destination="productService"/><mx:DataGrid dataProvider="{ro.findAll.lastResult}"
width="100%" height="100%"/><mx:Button label="Get Data" click="ro.findAll()"/>
</mx:Application>
NB in questo caso il client Flex deve essere compilato insieme ad un services-config.xml opportunamente configurato con la URL associata alla destination “productService” indicata esplicitamente oppure con i token di sostituzione e i rispettivi valori passati dal compilatore mxmlc o da Flex Builder.
![Page 16: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/16.jpg)
Spring Meeting Settembre 2009 16
Mapping Java-FlexJavapackage it.jug...odel;
public class Product { private Integer id; private String name; public Long getId() { return id; }
public void setId(Long id) { this.id = id; } public String getName() { return name; }
public void setName(String name) { this.name = name; }}
ActionScriptpackage {
[Bindable] [RemoteClass(alias="it...l.Product")] public class Product { public var id:*; public var name:String; }
}
![Page 17: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/17.jpg)
Spring Meeting Settembre 2009 17
Spring Remoting
● Modello generale per rendere accessibili esternamente i servizi Spring
● Adatto ad interazioni sincrone request-response
● Permette di implementare facilmente il backend di un'applicazione RIA
● Grazie alle funzionalità offerte da Spring, NON devo necessariamente pensare la mia applicazione in funzione della tecnologia con cui il client può accedere
![Page 18: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/18.jpg)
Spring Meeting Settembre 2009 18
Spring BlazeDS Integration
● Progetto congiunto SpringSource e Adobehttp://www.springsource.org/spring-flex
● Implementa Spring Remoting per Flex● Semplifica la configurazione di BlazeDS● Usa di BlazeDS la serializzazione AMF3,
tralasciando le funzionalità da “application server”=> la scelta migliore per applicazioni RIA
realizzate con Flex
![Page 19: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/19.jpg)
Spring Meeting Settembre 2009 19
Cosa offre Spring BlazeDS Integration?● la servlet di BlazeDS non crea più le destination,
ci pensa Spring con un Exporter adhoc!● Spring avvia il message broker di BlazeDS● un namespace adhoc per configurare Spring, flex● annotation (RemoteDestination) in alternativa alla
configurazione via XML● SpringLoginCommand per integrare
l'autenticazione di Spring Security→ una versione “ufficiale” ed estesa di soluzioni già presenti in giro su internet per blog di Adobe e non (già raccolte in modo “non ufficiale” nel progetto FNA http://fna-v2.googlecode.com/)
![Page 20: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/20.jpg)
Spring Meeting Settembre 2009 20
Un esempio
Realizzazione di un semplice servizio di yellow pages:● Interfaccia CompanyService● Implementazione CompanyServiceImpl● Model Company.java e Company.as● Configurazione Exporter BlazeDS
→ per client Flex● Configurazione Exporter CXF o Jersey su
JSON→ per client AJAX
![Page 21: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/21.jpg)
Spring Meeting Settembre 2009 21
AOP e Spring Security
● Come proteggere il nostro backend RIA?● Integro Spring Security via AOP non
modificando la mia implementazione!● Spring Security supporta tutti i più noti
meccanismi di autenticazione: su database, LDAP, NTLM e anche SSO come CAS
● Integrazione con applicazioni web “classiche” su Spring MVC tramite la DispatcherServlet, implementazione del pattern FrontController
![Page 22: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/22.jpg)
Spring Meeting Settembre 2009 22
AOP e Spring Securityhttp://www.mindtheflex.com/?p=67
![Page 23: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/23.jpg)
Spring Meeting Settembre 2009 23
Spring Remoting vs. Hibernate
● Caso d'uso: devo pubblicare un servizio Spring che accede a database tramite Hibernate
● Problema: come faccio a gestire le relazioni “lazy” nell'interazione con un client RIA senza avere la malefica LazyInitializationException?
● Soluzione: tramite Spring AOP serializzo solo i dati che posso effettivamente spedire e ricevere, ad esempio solo gli ID degli oggetti in relazione!
![Page 24: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/24.jpg)
Spring Meeting Settembre 2009 24
Messaging
● Spring Remoting va bene per interazioni sincrone stile request-response, e per interazioni asincrone stile publish-subscribe?
● Spring Integration è il nuovo progetto di Spring che definisce il modello astratto per gestirle e contiene implementazioni su JMS e POJO
● Spring Integration è già supportato nella release 1.0.0 di Spring BlazeDS Integration, come adapter per il messaging.
![Page 25: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/25.jpg)
Spring Meeting Settembre 2009 25
Publisher-Subscriber Flex API<?xml version="1.0" encoding="UTF-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.messaging.messages.AsyncMessage;
private function send():void {var messageBody:Object = {userId:userId.text, chatMessage: msg.text};producer.send(new AsyncMessage(messageBody));msg.text = "";
}
private function msgHandler(message:IMessage):void {log.text += message.body.userId + ": " + message.body.chatMessage + "\n";
}]]>
</mx:Script> <mx:Producer id="producer" destination="chat"/>
<mx:Consumer id="consumer" destination="chat" message="msgHandler(event.message)"/><mx:TextArea id="log" width="100%" height="100%"/><mx:TextInput id="userId" width="100"/><mx:TextInput id="msg" width="100%" enter="send()"/>
</mx:Application>
NB su BlazeDS posso usare un Adapter ActionScript fra soli client Flex o un JMS Adapter per interagire con una coda JMS, invece con Spring BlazeDS Integration posso anche usare un channel POJO di Spring Integration o inviare messaggi da server tramite la classe MessageTemplate analogamente a quanto disponibile con SimpleMailMessage per JavaMail
![Page 26: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/26.jpg)
Spring Meeting Settembre 2009 26
Spring ActionScript● Un IoC Container per ActionScript● Argina il proliferare di singleton nel codice
Flex/AS3● nasce come Prana Framework da Cristophe
Herreman: http://www.herrodius.com/● entra a far parte di Spring Extensions● Attualmente alla versione 0.8.1:
– configurazione object factory in XML con gestione namespace
– autowiring tramite metadata– integrazione MVC generica più estensioni
per Cairngorm e PureMVC
![Page 27: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/27.jpg)
Spring Meeting Settembre 2009 27
Spring ActionScript 101
● Creo un oggetto AS3 come interfaccia ed implementazione
● Lo aggiungo al file XML di Spring AS● Esternalizzo proprietà in un file di properties
caricato dal file XML● Nella mia mx:Application effettuo il bootstrap
di XmlApplicationContext oppure di FlexXmlApplicationContext
● Annoto con metadata [Autowired] i reference cui voglio venga applicata la dependency injection
![Page 28: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/28.jpg)
Spring Meeting Settembre 2009 28
RPC e Messaging namespace● aggiungo il supporto ai namespace al mio
ApplicationContext di Spring ActionScript:applicationContext.addNamespaceHandler(new RPCNamespaceHandler());applicationContext.addNamespaceHandler(new MessagingNamespaceHandler());
● dichiaro nell'intestazione del file XML lo schema relativo:<?xml version="1.0" encoding="UTF-8">
<objects xmlns="http://www.springactionscript.org/schema/objects" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:messaging="http://www.springactionscript.org/schema/messaging" xsi:schemaLocation="http://www.springactionscript.org/schema/objects http://www.springactionscript.org/schema/objects/spring-actionscript-objects-1.0.xsd http://www.springactionscript.org/schema/messaging/spring-actionscript-messaging-1.0.xsd">
● aggiungo i riferimenti ai miei RemoteObject in questo modo e configuro channel e channel set:<object id="amfChannel" class="mx.messaging.channels.AMFChannel"> <property name="uri" value="${blazeds.url}"/></object><messaging:channel-set id="cs" channels="amfChannel"/><rpc:remote-object id="ro" channel-set="cs" destination="productService"/>
● esternalizzo le properties di configurazione● imposto i miei RemoteObject come dipendenze
![Page 29: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/29.jpg)
Spring Meeting Settembre 2009 29
Red5
● Cos'è?Server di streaming opensource in Java per client Flash alternativo a Flash Media Server.
● Basato su:– Spring– Apache Mina– Tomcat
● Versione 0.8 stabile, in arrivo 0.9 RC1● Deployment come server standalone, war in
application server ed embedded
![Page 30: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/30.jpg)
Spring Meeting Settembre 2009 30
Cosa offre Red5?● Implementazione in reverse engineering del
protocollo RTMP, reso pubblico a gennaio da Adobe, con supporto varianti RTMPS e RTMPT
● Streaming Audio/Video● Recording Client Streams ● Remote Shared Objects● Live Stream Publishing● Remoting (AMF) per Flex API● client-to-server method call● server-to-client method client
![Page 31: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/31.jpg)
Spring Meeting Settembre 2009 31
Creare applicazioni Red5
● WAR packaging– WEB-INF
● lib● classes● web.xml● red5-web.xml (configurazione spring)● red5-properties.xml (properties per
sostituzione placeholder spring)● Per deployment embedded bisogna
aggiungere le configurazioni spring del server Red5
![Page 32: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/32.jpg)
Spring Meeting Settembre 2009 32
Come Red5 usa Spring● 2 livelli di ApplicationContext
– 1 parent application context● red5-common.xml → beans del server Red5● red5-core.xml → endpoint Mina TCP● red5-default.xml → root context Red5 di default
– N child application context → per applicazione WAR● red5-web.xml
● bean contenuti in un'application:– context– 1 o più scope– handler → entry point dell'applicazione Red5, deve essere
un bean del seguente tipo o sua sottoclasse: org.red5.server.adapter.ApplicationAdapter
![Page 33: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/33.jpg)
Spring Meeting Settembre 2009 33
Un'applicazione Red5Java Serverpackage the.path.to.my;import org.red5.server.adapter.ApplicationAdapter; public class Application extends ApplicationAdapter { public Double add(Double a, Double b){ return a + b; }}
ActionScript Clientnc = new NetConnection();nc.connect("rtmp://localhost/myapp", "myusername", "mypassword");nc.onResult = function(obj) { trace("The result is " + obj);}nc.call("add", nc, 1, 2);ns = new NetStream(nc);video = new Video();// publishns.attachCamera(Camera.getCamera());ns.publish("my-video", "live");// playvideo.attachNetStream(ns);ns.play("your-video");
![Page 34: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/34.jpg)
Spring Meeting Settembre 2009 34
Red5 al posto di FMS?SI!● sviluppo in Java con Spring invece che in script ActionScript
NON a oggetti– maggiori possibilità di integrazione– testing– posso fare scripting anche in Groovy, Jython e JRuby
● clustering con Terracotta● balancing con configurazione edge-origin ed MRTMP
Ma neanche per sogno!● non è la soluzione ufficiale supportata da Adobe!● non offre encryption tramite RTMPE che è un protocollo
proprietario!
![Page 35: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/35.jpg)
Spring Meeting Settembre 2009 35
Riferimenti● Spring BlazeDS Integration
http://www.springsource.com/spring-flex● Cristophe Coenraets Blog – esempi su Spring BlazeDS
Integrationhttp://coenraets.org/blog/
● Flexmojos – plugin Maven per Flexhttp://flexmojos.sonatype.org/
● Spring ActionScripthttp://www.springactionscript.org
● Red5http://www.red5.org
● “mavenized” Red5http://code.google.com/p/jakubiak-red5/
![Page 36: Spring e Flex](https://reader034.vdocuments.site/reader034/viewer/2022051514/5484ce21b4af9f820d8b4c86/html5/thumbnails/36.jpg)
Spring Meeting Settembre 2009 36
Q&AQ&A