Slides per l'incontro "Aperitivo tecnologico" del GDG Firenze
http://www.gdg-firenze.info/ del 16 dicembre 2013.
Argomenti:
Introduzione ad OSGi e ServiceMix
Introduzione ad Apache Camel
Utilizzare GWT su ServiceMix
SensorMix: Architettura di esempio
Cool Facts: perchè ci piace questa architettura
2. Sviluppare su OSGI
con Camel e GWT
Aperitivo tecnologico del GDG Firenze
http://www.gdg-firenze.info/
Cristiano Costantini - Giuseppe Gerla - Michele Ficarra - Sergio Ciampi - Stefano Cigheri
4. Sommario
·
·
·
·
·
Introduzione ad OSGi e ServiceMix
Introduzione ad Apache Camel
Utilizzare GWT su ServiceMix
SensorMix: Architettura di esempio
Cool Facts: perchè ci piace questa architettura
Aperitivo Osgi, Camel e GWT
4/108
5. Introduzione a OSGi e ServiceMix
Ovvero un approccio modulare per backend SOA
6. OSGi: questo sconosciuto
· OSGi: Open Service Gateway initiative
· OSGi Alliance: organizzazione fondata nel 1999 da Ericsson, IBM, Oracle e altri
· OSGi Framework: è un layer di modularità per la piattaforma Java
Il nucleo delle specifiche definisce la gestione del modello del ciclo di vita del
software, i moduli (chiamati bundles), un service registry e un ambiente di
esecuzione.
Aperitivo Osgi, Camel e GWT
6/108
7. Una Metafora:
Pensate ai servizi di Windows o demoni Unix ma completamente Java
Aperitivo Osgi, Camel e GWT
7/108
8. Perchè nasce OSGi
OSGi nasce con lo scopo di creare sistemi embedded per mercati residenziali,
automotive e M2M. In questi contesti è spesso necessario comunicare con i
devices attraverso protocolli differenti.
Il fine, quindi, era quello di fornire un modello di programmazione capace di
realizzare servizi end-to-end creando uno strato di astrazione che unificasse i
differenti protocolli.
Aperitivo Osgi, Camel e GWT
8/108
9. Perchè si espande
“ We’ve all used development platforms in the past,
such as Java Enterprise Edition (JEE), and even
though there have been great advances in this
industry, we’re still building large complex systems,
which are hard to develop, maintain, and extend. ”
Alexandre de Castro Alves
OSGi in Depth - Manning,
pagina 1, riga 1
Aperitivo Osgi, Camel e GWT
9/108
10. Implementazioni OSGi
Esistono diverse implementazioni di OSGi. Quelle più complete sono:
· Apache Felix
· Eclipse Equinox
· Knopflerfish
Aperitivo Osgi, Camel e GWT
10/108
11. Come è fatto un framework OSGi
Il framework può essere rappresentato con tre
layer:
· Il module layer definisce il concetto di modulo
OSGi: il Bundle
· Il lifecycle layer definisce come i bundles sono
dinamicamente installati e gestiti nel
framework OSGi
· Il service layer supporta e promuove un
modello di sviluppo di applicazioni flessibile
che incapsula concetti resi di uso comune dal
service-oriented programming
Aperitivo Osgi, Camel e GWT
Service
Lifecycle
Module
11/108
12. Il “Module layer”
Il cuore del module layer è il Bundle.
Un Bundle è un JAR che contiene metadati extra
(manifest).
A differenza dei JAR il bundle ha:
· un classpath “ristretto” al solo bundle
· un manifest più ricco
Grazie al manifest è possibile estendere la
visibilità del classpath dichiarando esplicitamente
le proprie dipendenze
Aperitivo Osgi, Camel e GWT
12/108
13. Il manifest OSGi
Nel manifest viene specificato anche:
· L’identificazione e la descrizione
· Il classloading
· L’attivazione
Esempi:
Aperitivo Osgi, Camel e GWT
13/108
14. Il manifest OSGi
Manifest di un semplice JAR compilato con maven
Mnfs-eso:10
aietVrin .
BidJk 1704
ul-d: .._0
BitB:ggfrne
ul-y d-iez
CetdB:Aah Mvn
rae-y pce ae
Aperitivo Osgi, Camel e GWT
MNFS.F
AIETM
14/108
15. Il manifest OSGi
Manifest di un Bundle
Mnfs-eso:10
aietVrin .
BdLsMdfe:1870422
n-atoiid 365476
BidJk 1704
ul-d: .._0
BitB:ggfrne
ul-y d-iez
Bnl-aieteso:2
udeMnfsVrin
Bnl-ae GGFrne: Snomx: EapeBnl
udeNm: D iez : esri : xml ude
Bnl-yblcae eapebnl
udeSmoiNm: xml-ude
Bnl-edr GGFrne: SnomxTa
udeVno: D iez : esri em
Bnl-eso:100SASO
udeVrin ...NPHT
Bnl-ciao:cmgol.eeoesggiez.aaevc.ciao
udeAtvtr o.ogedvlpr.dfrnedtsrieAtvtr
CetdB:Aah MvnBnl Pui
rae-y pce ae ude lgn
Epr-akg:
xotPcae
cmgol.eeoesggiez.oe;eso=100SASO"
o.ogedvlpr.dfrnemdlvrin"...NPHT,
cmgol.eeoesggiez.sivrin"...NPHT,
o.ogedvlpr.dfrneog;eso=100SASO"
cmgol.eeoesggiez.evc;eso=100SASO"
o.ogedvlpr.dfrnesrievrin"...NPHT
Ipr-akg:
motPcae
jvxjsjvxjssa,aa.m.idantto,aa.m.s
aa.w,aa.w.opjvxxlbn.noainjvxxlw
To:Bd15.
ol n-.00
Aperitivo Osgi, Camel e GWT
MNFS.F
AIETM
15/108
16. Il “Lifecycle layer”
Il lifecycle layer ha due scopi:
Esternamente gestisce il ciclo di vita del bundle.
Aperitivo Osgi, Camel e GWT
16/108
17. Il “Lifecycle layer”
Il lifecycle layer ha due scopi:
Internamente definisce Bundle Activator
= public static void main(String[] args)
Aperitivo Osgi, Camel e GWT
17/108
18. Il “Service layer”
L’OSGi service layer promuove l’approccio basato su interface ed in particolare
la separazione tra interfacce e implementazioni.
I Servizi OSGi sono interfacce Java che rappresentano un contratto tra il service
provider e i service clients.
Aperitivo Osgi, Camel e GWT
18/108
19. OSGi: la Service Platform
L’OSGi definisce un set minimo di servizi per
agevolare lo sviluppo di applicazioni modulari
· Cofiguration Admin (hot configuration)
· Event Admin
· Console Admin
· Log Service
· Blueprint component framework
Aperitivo Osgi, Camel e GWT
19/108
20. Karaf: un OSGi container
Karaf è un OSGi container in cui sono deployati bundles (e servizi) aggiuntivi per
fornire ulteriori funzionalità tra cui Hot deployment, Dynamic configuration,
Logging System, Extensible Shell console (SSH)
Karaf è un chiaro esempio di architettura basata su OSGi
Aperitivo Osgi, Camel e GWT
20/108
21. ServiceMix: un ESB su OSGi
ServiceMix estende ulteriormente Karaf con funzionalità per
implementare un Enterprise Service Bus.
Le principali funzionalità di ServiceMix sono:
· reliable messaging with Apache ActiveMQ
· messaging, routing and Enterprise Integration Patterns with
Apache Camel
· WS-* and RESTful web services with Apache CXF
· OSGi-based server runtime powered by Apache Karaf
Altre funzionalità offerte da ServiceMix:
· loosely coupled integration between all the other components with Apache ServiceMix NMR including
rich Event, Messaging and Audit API
· complete WS-BPEL engine with Apache ODE
Aperitivo Osgi, Camel e GWT
21/108
22. OSGi e Spring
Uso di Spring dentro a Karaf/ServiceMix
Lo springframework fornisce molte features interessanti (dependency injection, ORM, AOP,...)
Lo Spring Deployer riconosce i file Spring all'interno del folder META-INF/spring di un Jar, e ne istanzia i
bean che vi sono definiti, senza necessità di utilizzare le API OSGi
<xlvrin"."ecdn=UF8?
?m eso=10 noig"T-">
<en xls"tp/wwsrnfaeokogshm/en"
bas mn=ht:/w.pigrmwr.r/ceabas
xlscnet"tp/wwsrnfaeokogshm/otx"
mn:otx=ht:/w.pigrmwr.r/ceacnet
xlsxi"tp/www.r/01XLceaisac"
mn:s=ht:/w.3og20/MShm-ntne
xishmLcto=ht:/w.pigrmwr.r/ceabas
s:ceaoain"tp/wwsrnfaeokogshm/en
ht:/w.pigrmwr.r/ceabassrn-en-..s"
tp/wwsrnfaeokogshm/en/pigbas30xd>
SRN
PIG
<eni=cnue"cas"o.yplcto.elWrdosmr
ba d"osmr ls=cmmapiainHloolCnue"
dsrymto=ogDsry ii-ehd"sint/
eto-ehd"sieto" ntmto=ogIi">
<bas
/en>
Aperitivo Osgi, Camel e GWT
22/108
23. OSGi e Spring
Spring DM
Spring DM permette di utilizzare servizi OSGi da Spring in modo trasparente.
<xlvrin"."ecdn=UF8?
?m eso=10 noig"T-">
<en xls"tp/wwsrnfaeokogshm/en"
bas mn=ht:/w.pigrmwr.r/ceabas
xlsxi"tp/www.r/01XLceaisac"
mn:s=ht:/w.3og20/MShm-ntne
xlsog=ht:/w.pigrmwr.r/ceaog"
mn:si"tp/wwsrnfaeokogshm/si
xlsui=ht:/w.pigrmwr.r/ceaui"
mn:tl"tp/wwsrnfaeokogshm/tl
xlscnet"tp/wwsrnfaeokogshm/otx"
mn:otx=ht:/w.pigrmwr.r/ceacnet
xishmLcto=ht:/w.pigrmwr.r/ceaog
s:ceaoain"tp/wwsrnfaeokogshm/si
ht:/w.pigrmwr.r/ceaog/pigog.s"
tp/wwsrnfaeokogshm/sisrn-sixd>
SRN D
PIG M
<sisrierf"vnSrie
og:evc e=eetevc"
itrae"o.yplcto.elWrdevc"/
nefc=cmmapiainHloolSrie >
<bas
/en>
Aperitivo Osgi, Camel e GWT
23/108
25. “Integrare”
Cosa si intende quando parliamo di integrazione?
Trovare una soluzione al seguente problema:
“ Come posso far funzionare insieme molteplici
applicazioni attraverso lo scambio di
informazioni? ”
Aperitivo Osgi, Camel e GWT
25/108
26. Enterprise Integration Patterns
Gli Enterprise Integration Patters offrono soluzioni per affrontare il precedente
problema.
Cosa sono gli EIP?
Aperitivo Osgi, Camel e GWT
26/108
28. EIP Importanti
Message Channel:
How does one application communicate with another using messaging?
Message:
How can two applications connected by a message channel exchange a piece of information?
Message Router:
How can you decouple individual processing steps so that messages can be passed to different filters depending on a set of conditions?
Message Translator:
How can systems using different data formats communicate with each other using messaging?
Message Endpoint:
How does an application connect to a messaging channel to send and receive messages?
Dead Letter Channel:
What will the messaging system do with a message it cannot deliver?
Message Bus:
What is an architecture that enables separate applications to work together, but in a decoupled fashion such that applications can be easily added or removed without affecting
the others?
Command Message:
How can messaging be used to invoke a procedure in another application?
Document Message:
How can messaging be used to transfer data between applications?
Event Message:
How can messaging be used to transmit events from one application to another?
Request-Reply:
When an application sends a message, how can it get a response from the receiver?
Canonical Data Model:
How can you minimize dependencies when integrating applications that use different data formats?
Aperitivo Osgi, Camel e GWT
28/108
29. Come si può fare integrazione?
I principali metodi tramite cui avviene integrazione sono:
· Scambio di file
· Database condiviso
· Remote Procedure Invocation
· Messaging
Gli EIP si focalizzano sulla integrazione via “messaging” e definiscono una
notazione per rappresentare le soluzioni di integrazione.
Aperitivo Osgi, Camel e GWT
29/108
34. Come implementare facilmente EIP?
(domanda retorica)
Integrare è però difficile perchè esiste una vasta eterogeneità di protocolli,
interfacce e formati.
Come si possono implementare su una piattaforma Java gli Enterprise
Integration Pattern?
con
“ Apache Camel ”
Concise Application Messaging Exchange Language
Aperitivo Osgi, Camel e GWT
34/108
35. Apache Camel
Apache Camel è un framework di integrazione open-sorce versatile basato sugli
Enterprise Integration Patterns del libro di Hohpe e Woolf.
Include un vasto insieme di componenti per funzionare con molti protocolli di
trasporto e formati dati e permette di definire regole di instradamento e
intermediazione attraverso l’uso di domain-specific language.
...si presta talmente bene alla integrazione che ServiceMix, dalla versione 3 alla
4, ha abbandonato la tecnologia JBI per adottare un nuovo approccio alla
integrazione basato su Camel e OSGi.
Aperitivo Osgi, Camel e GWT
35/108
36. Esempio: Content Based Router
from newOrder
choice
when isWidget to widget
otherwise to gadget
Aperitivo Osgi, Camel e GWT
36/108
37. Content Based Router in Java DSL
from newOrder
choice
when isWidget to widget
otherwise to gadget
pbi casMRueetnsRueule {
ulc ls yot xed otBidr
JV DL
AA S
pbi vi cniue)trw Ecpin{
ulc od ofgr( hos xeto
fo(atvm:uu:eOdr)
rm"cieqqeenwre"
.hie)
coc(
.hnxah"odrpout='igt")
we(pt(/re/rdc
wde')
.o"cieqqeewde"
t(atvm:uu:igt)
.tews(
ohrie)
.o"cieqqeegde"
t(atvm:uu:agt)
.n(;
ed)
}
}
Aperitivo Osgi, Camel e GWT
37/108
38. Content Based Router in Spring XML
from newOrder
choice
when isWidget to widget
otherwise to gadget
<aeCnetxls"tp/cmlaah.r/ceasrn"
cmlotx mn=ht:/ae.pceogshm/pig>
<ot>
rue
<rmui"cieqqeenwre">
fo r=atvm:uu:eOdr/
<hie
coc>
<hn
we>
<pt>odrpout='igt<xah
xah/re/rdc
wde'/pt>
<oui"cieqqeewde">
t r=atvm:uu:igt/
<we>
/hn
<tews>
ohrie
<oui"cieqqeegde">
t r=atvm:uu:agt/
<ohrie
/tews>
<coc>
/hie
<rue
/ot>
<cmlotx>
/aeCnet
Aperitivo Osgi, Camel e GWT
SRN XL
PIG M
38/108
39. Una applicazione Camel completa:
ipr ogaah.ae.aeCnet
mot r.pcecmlCmlotx;
ipr ogaah.ae.ule.otBidr
mot r.pcecmlbidrRueule;
ipr ogaah.ae.mlDfutaeCnet
mot r.pcecmlip.ealCmlotx;
SRN XL
PIG M
pbi casCmlxml {
ulc ls aeEape
pbi sai vi mi(tig]ag)trw Ecpin{
ulc ttc od anSrn[ rs hos xeto
Cmlotx cnet=nwDfutaeCnet)
aeCnet otx
e ealCmlotx(;
cnetadotsnwRueule( {
otx.dRue(e otBidr)
pbi vi cniue){
ulc od ofgr(
fo(jtyht:/...:00tlMSmtig)
rm"et:tp/000088/eleoehn"
.rnfr(ipe"o sy$i.oy")
tasomsml(Yu a {nbd})
.o"eoiyrsos.m)
t(vlct:epnev";
}
};
)
cnetsat)
otx.tr(;
Sse.u.rnl(PesETRt ei";
ytmotpitn"rs NE o xt)
Sse.nra(;
ytmi.ed)
cnetso(;
otx.tp)
}
}
Aperitivo Osgi, Camel e GWT
39/108
40. Camel in ServiceMix
Una volta attivati i bundle di Camel su Karaf-ServiceMix...
Aperitivo Osgi, Camel e GWT
40/108
41. Camel in ServiceMix
...è possibile definire rotte direttamente nei file Spring XML, oppure utilizzare dei RouteBuilder in Java per
avviare delle applicazioni che usano Camel all’interno di ServiceMix.
<xlvrin"."ecdn=UF8?
?m eso=10 noig"T-">
<en xls"tp/wwsrnfaeokogshm/en"
bas mn=ht:/w.pigrmwr.r/ceabas>
SRN XL
PIG M
<aeCnetxls"tp/cmlaah.r/ceasrn"
cmlotx mn=ht:/ae.pceogshm/pig>
<ot>
rue
<rmui"et:tp/000088/eleoehn">
fo r=jtyht:/...:00tlMSmtig/
<ovrBdT tp=jv.agSrn">
cnetoyo ye"aaln.tig/
<rnfr>
tasom
<ipeYusy$i.oy<sml>
sml>o a {nbd}/ipe
<tasom
/rnfr>
<oui"eoiyrsos.m /
t r=vlct:epnev" >
<rue
/ot>
<cmlotx>
/aeCnet
<bas
/en>
Aperitivo Osgi, Camel e GWT
41/108
43. Camel: data format
25+ data format elencati su camel.apache.org/data-format.html
Avro
Base64
BeanIO
Bindy
Castor
Crypto
CSV
EDI
Flatpack DataFormat
GZip data format
HL7 DataFormat
JAXB
JiBX
JSON
PGP
Protobuf
Serialization
SOAP
String
XmlBeans
XmlJson
XMLSecurity DataFormat
XStream
Zip DataFormat
Zip File DataFormat
Aperitivo Osgi, Camel e GWT
43/108
44. Utilizzare GWT su ServiceMix
Ovvero un modo diverso per fare Web Application
46. Framework Web per SOFEA
http://raibledesigns.com/
Aperitivo Osgi, Camel e GWT
46/108
47. ServiceMix e le Web Application
ServiceMix non nasce come Web Container ma permette lo stesso di deployare
delle web application.
In particolare risulta molto interessante qualora l’applicazione segua l’approccio
precedente.
Aperitivo Osgi, Camel e GWT
47/108
49. Deploy di WAR sotto Karaf/ServiceMix
WAR Deployer
Il WAR Deployer è un bundle che si occupa del deploy di Web Application su
Karaf/ServiceMix
Cosa fa?
· Cerca il file /WEB-INF/web.xml
· Se lo trova, pubblica i file statici e le Servlet definite nel web.xml via HTTP
Ma basta?
Aperitivo Osgi, Camel e GWT
49/108
50. Deploy di WAR sotto Karaf/ServiceMix
Il WAR ha bisogno di modifiche
· Deve avere un file /META-INF/MANIFEST.MF nella root del JAR
· Il MANIFEST.MF deve contenere:
- L'header W b C n e t a h(l'applicazione verrà pubblicata al context
e-otxPt
path specificato da questo header)
- L'header B n l - l s P t : . W B I F c a s s(informa
udeCasah ,E-N/lse
Karaf/ServiceMix dove sono i bytecode)
É raccomandato fare uno Skinny war e usare dipendenze di Bundle (usando il
maven-war-plugin e il maven-bundle-plugin)
Abbiamo Finito?
Aperitivo Osgi, Camel e GWT
50/108
51. Applicazioni GWT sotto Karaf/ServiceMix
...anche gwt-servlet.jar ha bisogno di modifiche!
GWT non è predisposto per essere usato in OSGi.
Non è un bundle perchè al manifest della gwt-servlet.jar mancano gli header OSGi.
E allora?
Aperitivo Osgi, Camel e GWT
51/108
52. Come usare GWT con OSGi
Quattro strade:
Ci sono 4 strade per ottenere un gwt-servlet.jar OSGi compliant e poterlo deployare su Karaf/ServiceMix.
Caso 1:
Compilarsi a mano il gwt-servlet.jar con gli header OSGi necessari
Caso 2:
Deployare il Jar non-OSGi configurandolo al momento della installazione su Karaf/ServiceMix
passando come parametro le informazioni che dovrebbero essere contenute nel MANIFEST.MF
Caso 3:
Aspettare che il ServiceMix Team rilasci il Bundle per GWT-Servlet con gli header OSGi per la
versione 2.6.0
Caso 4:
Sperare che il GWT Project Team accetti la patch, che abbiamo proposto, nella versione GWT
2.6.0 o successive.
Aperitivo Osgi, Camel e GWT
52/108
53. Come usare GWT con OSGi
Che cosa significa?
Caso 1:
gtfthhts/gtgolsuc.o/w rf/hne/155/
i ec tp:/w.ogeorecmgt escags5/317
gtceku FTHHA
i hcot EC_ED
atds
n it
isal- mncmgol.w/w-eve/..
ntl s v:o.ogegtgtsrlt260
Caso 2:
isal- wa:v:o.ogegtgtsrlt260Bnl-aeGTSrltB
ntl s rpmncmgol.w/w-eve/..$udeNm=W-eve&u
nl-yblcaecmgol.w.w-eve&udeVrin260Epr-akg
deSmoiNm=o.ogegtgtsrltBnl-eso=..&xotPca
ecmgol.w.srcin.p.,r.ient.aiao.niecmgol.e
=o.ogegtue.letrc*oghbraevldtregn,o.ogew
bbneyrqetatr.mip.,jvxvldto,oghbraevldtr*
.idr.eusfcoyv.ml*!aa.aiain!r.ient.aiao.
,*cin.,*ip.,&motPcaejvxsrlt*jvxvldto;eou
!.let*!.ml**Ipr-akg=aa.eve.,aa.aiainrsl
to:otoa,r.snrslto:otoa,aa.aiain*rslto:ot
in=pinlogjo;eouin=pinljvxvldto.;eouin=p
inlogjo.;eouin=pinl!o.ogegt**rslto:otoa
oa,r.sn*rslto:otoa,cmgol.w.,;eouin=pinl
Caso 3:
isal- mnogaah.evcmxbnlsogaah.evcmxbnlsgtsrlt2601
ntl s v:r.pcesriei.ude/r.pcesriei.ude.w-eve/.._
Caso 4:
isal- mncmgol.w/w-eve/..
ntl s v:o.ogegtgtsrlt260
Aperitivo Osgi, Camel e GWT
53/108
54. Esempi GWT su ServiceMix
Abbiamo adattato alcuni esempi della distribuzione GWT per funzionare su
Karaf/ServiceMix:
https://github.com/cristcost/gwt-karaf-examples
Tra poco faremo vedere un esempio che mette insieme tutte le tecnologie
raccontate fino ad ora.
Aperitivo Osgi, Camel e GWT
54/108
60. Il Canonical Data Model EIP
Dal libro EIP:
“I am designing several applications to work together through Messaging. Each
application has its own internal data format.”
“How can you minimize dependencies when integrating applications that use
different data formats?”
Aperitivo Osgi, Camel e GWT
60/108
62. Il nostro approccio al CDM
A noi piace l’approccio Java first:
· Modello dati: POJO
· Modello servizi: Interfacce Java
Usiamo annotazioni JaxB e JaxWS per generare dal nostro modello gli XML
Schema e WSDL.
Troviamo che cominciare dagli oggetti sia più naturale, lineare e agile:
· Lo XML Schema finale risulta più pulito
· Si può fare a meno della validazione XML
- eccezioni Java = XML non valido
· Lavorare sulle classi Java è più veloce (per noi che siamo sviluppatori)
Aperitivo Osgi, Camel e GWT
62/108
66. Utilizzo del CDM su GWT
Infine, se si vuole usare il data model anche dentro un progetto GWT, basta
aggiungere un modulo .gwt.xml:
GTXL
W M
<xlvrin"."ecdn=UF8?
?m eso=10 noig"T-">
<- We udtn yu vrino GT yusol as udt ti DDrfrne
!- hn paig or eso f W, o hud lo pae hs T eeec,
s ta yu apcntk avnaeo telts GTmdl cpblte.->
o ht or p a ae datg f h aet W oue aaiiis <DCYEmdl PBI "/Gol Ic/DDGol WbTokt251/N
!OTP oue ULC -/oge n./T oge e oli ../E"
"tp/gol-e-oli.ogeoecmsntg
ht:/ogewbtoktgolcd.o/v/as
/../itosuc/oescgtmdl.t"
251dsr-orecr/r/w-ouedd>
<oue
mdl>
<- Seiyteptsfrtasaal cd ->
!- pcf h ah o rnltbe oe <orept=mdl /
suc ah'oe' >
<orept=srie /
suc ah'evc' >
<mdl>
/oue
Aperitivo Osgi, Camel e GWT
66/108
68. Il bundle dataservice
Contiene un servizio che espone funzionalità di memorizzazione e recupero di
informazioni
Il servizio viene registrato in OSGi tramite Spring DM
Aperitivo Osgi, Camel e GWT
68/108
69. La registrazione del servizio
<si:mpoete i=dtSucPoete"
ogxc-rpris d"aaorerpris
pritn-d"esri.p.essecui"
esseti=snomxjapritnent>
<rpky"esri_bdieCasae>r.slbjbDie<po>
po e=snomxd.rvrlsNm"oghqd.dcrvr/rp
<rpky"esri_bul>dchqd:e:esri_b/rp
po e=snomxd.r"jb:slbmmsnomxd<po>
<rpky"esri_buenm"s<po>
po e=snomxd.srae>a/rp
<rpky"esri_bpswr"<po>
po e=snomxd.asod>/rp
<ogxc-rpris
/si:mpoete>
SRN D
PIG M
<sisrierf"esriSrie>
og:evc e=snomxevc"
<siitrae>
og:nefcs
<au>o.ogedvlpr.dfrnesrieSnomxevc<vle
vlecmgol.eeoesggiez.evc.esriSrie/au>
<au>o.ogedvlpr.dfrneog.esriAmnnefc<vle
vlecmgol.eeoesggiez.siSnomxdiItrae/au>
<og:nefcs
/siitrae>
<og:evc>
/sisrie
Aperitivo Osgi, Camel e GWT
69/108
70. Il servizio in java
pbi casSnomxevcJamlipeet Snomxevc,SnomxdiItrae{
ulc ls esriSriepIp mlmns esriSrie esriAmnnefc
JV
AA
piaeEttMngratr ettMngratr;
rvt niyaaeFcoy niyaaeFcoy
@vrie
Oerd
pbi Ls<tig lsSnosd( {
ulc itSrn> itesrIs)
Ls<tig rsl =nwAryitSrn>)
itSrn> eut
e raLs<tig(;
ty{
r
EttMngre =ettMngratr.raeniyaae(;
niyaae m
niyaaeFcoycetEttMngr)
Tpdur<tig q=e.raeur(SLC si FO Jaesrs,Srn.ls)
yeQeySrn>
mcetQey"EET .d RM pSno " tigcas;
rsl.dAlqgteutit);
eutadl(.eRslLs()
e.ls(;
mcoe)
}cth(xeto e {
ac Ecpin )
lge.o(ee.EEE "ro drn snosls rtivn" e;
ogrlgLvlSVR, Err uig esr it ereig, )
}
rtr rsl;
eun eut
}
Aperitivo Osgi, Camel e GWT
70/108
71. Spring ORM
<eni=ef cas"r.pigrmwr.r.p.oaCnanrniyaaeFcoyen>
ba d"m" ls=ogsrnfaeokomjaLclotieEttMngratrBa"
<rprynm=pritnentae vle"esri_b /
poet ae"essecUiNm" au=snomxd" >
<rprynm=jaedrdpe"
poet ae"pVnoAatr>
<encas"r.pigrmwr.r.p.edrElpeikpVnoAatr>
ba ls=ogsrnfaeokomjavno.cisLnJaedrdpe"
<rprynm=soSl vle"re /
poet ae"hwq" au=tu" >
<ba>
/en
<poet>
/rpry
<rprynm=jarpris>
poet ae"pPoete"
<rp>
pos
<rpky"cisln.d-eeain>raetbe<po>
po e=elpeikdlgnrto"cet-als/rp
<rpky"cisln.ogn.ee"IF<po>
po e=elpeiklgiglvl>NO/rp
<rpky"cisln.evn"fle/rp
po e=elpeikwaig>as<po>
<rpky"aa.essec.dcdie"$snomxd.rvrlsNm}/rp
po e=jvxpritnejb.rvr>{esri_bdieCasae<po>
<rpky"aa.essec.dcul>{esri_bul<po>
po e=jvxpritnejb.r"$snomxd.r}/rp
<rpky"aa.essec.dcue"$snomxd.srae<po>
po e=jvxpritnejb.sr>{esri_buenm}/rp
<rpky"aa.essec.dcpswr"$snomxd.asod<po>
po e=jvxpritnejb.asod>{esri_bpswr}/rp
<pos
/rp>
<poet>
/rpry
<ba>
/en
SRN D
PIG M
<eni=snomxevc"
ba d"esriSrie
cas"o.ogedvlpr.dfrnedtsrieSnomxevcJaml>
ls=cmgol.eeoesggiez.aaevc.esriSriepIp"
<rprynm=ettMngratr"rf"m"/
poet ae"niyaaeFcoy e=ef >
<ba>
/en
Aperitivo Osgi, Camel e GWT
71/108
73. Il bundle di integrazione
Definisce le rotte Camel per l'ingresso dei campioni da Android, Arduino e iOS
Utilizza quasi esclusivamente configurazione via Spring XML
Unica eccezione: la classe SampleAdapter che trasforma da protocol buffer al
nostro data model tramite codice java
Aperitivo Osgi, Camel e GWT
73/108
75. Le rotte di ingresso UDP e HTTP
Usate da Android e da Arduino
<ot>
rue
<rmui"ia:d:/...:08"/
fo r=mn2up/0000101 >
<oui"eajoEty /
t r=sd:snnr" >
<rue
/ot>
SRN XL
PIG M
<ot>
rue
<rmui"et:tp/0000100snomxapeEdon"/
fo r=jtyht:/...:08/esriSmlsnpit >
<oui"eajoEty /
t r=sd:snnr" >
SRN XL
PIG M
<eHae haeNm=CnetTp"
stedr edrae"otn-ye>
<osatapiainjo<cntn>
cntn>plcto/sn/osat
<stedr
/eHae>
<oui"eoiyv_epae/snrsos_epaev"/
t r=vlct:mtmltsjo_epnetmlt.m >
<rue
/ot>
Aperitivo Osgi, Camel e GWT
75/108
76. La rotta di trasformazione del JSON
<ot>
rue
<rmui"eajoEty /
fo r=sd:snnr" >
<ovrBdT tp=jv.agSrn"/
cnetoyo ye"aaln.tig >
SRN XL
PIG M
<nasa>
umrhl
<mjo eeetae"tm aryae"it roNm=ro"/
xlsn lmnNm=ie" raNm=ls" otae"ot >
<umrhl
/nasa>
<oui"stxl_dpesrwcmaatrxl /
t r=xl:staatr/a2d_dpe.s" >
<nasa>
umrhl
<abcnetah"o.ogedvlpr.dfrnesrie /
jx otxPt=cmgol.eeoesggiez.evc" >
<umrhl
/nasa>
<oui"easrienr"/
t r=sd:evcEty >
<rue
/ot>
Aperitivo Osgi, Camel e GWT
76/108
77. La rotta TCP + ProtoBuf
<ot>
rue
<rmui"et:c:/...:08/dcdr=lnt-eoe&m;ycfle /
fo r=ntytp/0000102?eoes#eghdcdrapsn=as" >
<nasa>
umrhl
<rtbfisacCas"o.ogedvlpr
poou ntnels=cmgol.eeoes
.dfrnepoou.esriPoo$apeesg"/
ggiez.rtbfSnomxrtsSmlMsae >
<umrhl
/nasa>
<enrf"apedpe"mto=tasom /
ba e=smlAatr ehd"rnfr" >
<oui"easrienr"/
t r=sd:evcEty >
<rue
/ot>
SRN XL
PIG M
<eni=smlAatr
ba d"apedpe"
cas"o.ogedvlpr.dfrneitgainSmlAatr /
ls=cmgol.eeoesggiez.nerto.apedpe" >
pcaecmgol.eeoesggiez.nerto;
akg o.ogedvlpr.dfrneitgain
JV
AA
pbi casSmlAatr{
ulc ls apedpe
pbi Smlsala tasomSmlMsaemsae {
ulc apePyod rnfr(apeesg esg)
Smlsala rt=nwSmlsala(;
apePyod e
e apePyod)
/ poes'apeesg'adrtr teaatd'apePyod
/ rcs SmlMsae n eun h dpe Smlsala'
rtr rt
eun e;
}
}
Aperitivo Osgi, Camel e GWT
77/108
78. L'output verso il servizio OSGi
<sirfrnei=snomxevc"
og:eeec d"esriSrie
itrae"o.ogedvlpr.dfrnesrieSnomxevc"
nefc=cmgol.eeoesggiez.evc.esriSrie
tmot"00"criaiy".1 /
ieu=300 adnlt=1." >
SRN XL
PIG M
<ot>
rue
<rmui"easrienr"/
fo r=sd:evcEty >
<oui"ensnomxevc?ehdrcrSmls$bd.ape}"/
t r=ba:esriSriemto=eodape({oysmls) >
<rue
/ot>
Aperitivo Osgi, Camel e GWT
78/108
80. SensorMix GWT Web Application
Abbiamo visto che per il deploy di una Web Application GWT su
Karaf/ServiceMix dobbiamo garantire che:
· Il WAR sia un bundle OSGi compliant
· Che gwt-servlet.jar sia stata correttamente installata come bundle.
Noi cosa abbiamo fatto?
Aperitivo Osgi, Camel e GWT
80/108
82. Configuriamo il maven-war-plugin
Ricordate lo skinny war?
Si tolgono le dipendenze dalla lib:
<akgnEcue>E-N/i/
pcaigxldsWBIFlb,
WBIFcassMT-N//akgnEcue>
E-N/lse/EAIF<pcaigxlds
PMXL
O.M
Si istruisce Maven di copiare il Manifest al posto giusto:
<rhv>
acie
<aietie
mnfsFl>
$poetbidotuDrcoy/EAIFMNFS.F
{rjc.ul.uptietr}MT-N/AIETM
<mnfsFl>
/aietie
<acie
/rhv>
Aperitivo Osgi, Camel e GWT
PMXL
O.M
82/108
83. Importiamo il Canonical Data Model
Nel file SensormixAdminApp.gwt.xml:
<neisnm=cmgol.eeoesggiez.esri'/
ihrt ae'o.ogedvlpr.dfrneSnomx >
.W.M
GTXL
Nel pom.xml:
<eedny
dpnec>
<ruI>o.ogedvlpr.dfrne/ruI>
gopdcmgol.eeoesggiez<gopd
<riatdsnomxdtmdlai/riatd
atfcI>esri-aaoe-p<atfcI>
<eso>{rjc.eso}/eso>
vrin$poetvrin<vrin
<dpnec>
/eedny
<eedny
dpnec>
<ruI>o.ogedvlpr.dfrne/ruI>
gopdcmgol.eeoesggiez<gopd
<riatdsnomxdtmdlai/riatd
atfcI>esri-aaoe-p<atfcI>
<eso>{rjc.eso}/eso>
vrin$poetvrin<vrin
<lsiirsucs/lsiir
casfe>ore<casfe>
<dpnec>
/eedny
Aperitivo Osgi, Camel e GWT
PMXL
O.M
83/108
84. GWT RPC Plumbing diagram
Siamo partiti da qui...
Aperitivo Osgi, Camel e GWT
84/108
86. GWT RPC in Sensormix
Lato Client
Instanziare la service interface usando GWT.create():
GtesriSriesn snomxevc
wSnomxevcAyc esriSrie
=GTcet(wSnomxevc.ls)
W.raeGtesriSriecas;
JV
AA
Fare la chiamata al servizio:
snomxevc.itesrIsnwAycalak){
esriSrielsSnosd(e snClbc(
@vrie
Oerd
pbi vi oFiueTrwbecuh){
ulc od nalr(hoal agt
/ hnl terqetfiue
/ ade h eus alr
}
JV
AA
@vrie
Oerd
pbi vi oScesLs rsl){
ulc od nucs(it eut
/ hnl tersos fo tesrie
/ ade h epne rm h evc
}
};
)
Aperitivo Osgi, Camel e GWT
86/108
87. GWT RPC in Sensormix
Lato Server
SensormixServiceProxy.java è un servizio GWT che usa un servizio OSGi. Nella inizializazione ottiene dei
riferimenti al servizio utilizzando le API del Framework.
pbi vi ii( trw Srltxeto {
ulc od nt) hos eveEcpin
JV
AA
fnlBnlCnetcnet=Faeoktlgtudeti.eCas).eBnlCnet)
ia udeotx otx
rmwrUi.eBnl(hsgtls()gtudeotx(;
takr=nwSrierce(otx,Snomxevc.ls.eNm(,nl)
rce
e evcTakrcnet esriSriecasgtae) ul;
takroe(;
rce.pn)
}
Come viene usata l’istanza del servizio OSGi?
piaeSnomxevc gtevc( {
rvt esriSrie eSrie)
rtr (esriSrie takrwiFrevc(00)
eun Snomxevc) rce.atoSrie100;
}
JV
AA
pbi Ls<tig lsSnosd( {
ulc itSrn> itesrIs)
rtr gtevc(.itesrIs)
eun eSrie)lsSnosd(;
}
Aperitivo Osgi, Camel e GWT
87/108
91. Integrazione di Android
JV
AA
HtPs htps =nwHtPs(r.otig);
tpot tpot
e tpotultSrn()
htps.eHae(Cnettp" "plcto/sn)
tpotstedr"otn-ye, apiainjo";
SrnEtt s =nwSrnEtt(oyoHtPsRqet;
tigniy e
e tigniybdFrtpoteus)
s.eCnetnoignwBscedrHT.OTN_YE
estotnEcdn(e aiHae(TPCNETTP,
"plcto/sn);
apiainjo")
htps.eEtt(e;
tpotstniys)
HtRsos rsos =htcin.xct(tpot;
tpepne epne
tpleteeuehtps)
Srn tm =EttUistSrn(epnegtniy);
tig ep
niytl.otigrsos.eEtt()
lge.no"SNps rsos:"+tm)
ogrif(JO ot epne
ep;
Aperitivo Osgi, Camel e GWT
91/108
92. Integrazione di Android - NFC
JV
AA
Tgtg=gtnet)gtaclbexr(fAatrETATG;
a a
eItn(.ePrealEtaNcdpe.XR_A)
SrnBidri =nwSrnBidr)
tigule d
e tigule(;
bt[ dt =tggtd)
ye] aa
a.eI(;
fr(n i=0 i<dt.egh i+ {
o it
;
aalnt; +)
i.pedSrn.omt"0x,dt[])
dapn(tigfra(%2" aai);
i ( <dt.egh-1 {
f i
aalnt
)
i.ped"";
dapn(:)
}
}
JOOjc joSmlPce =nwJOOjc(;
SNbet snapeakt
e SNbet)
JOOjc oj=nwJOOjc(;
SNbet b
e SNbet)
joSmlPce.u(sml" oj;
snapeaktpt"ape, b)
ojpt"eiei" "h dvc i";
b.u(dvc_d, te eie d)
ojpt"ie,dtFra.omtnwDt();
b.u(tm" aeomtfra(e ae))
ojpt"f" i)
b.u(nc, d;
Itn itn =nwItn(hs DtSneSriecas;
net net
e netti, aaedrevc.ls)
itn.uEtaDtSneSrieITN_XR,
netptxr(aaedrevc.NETETA
joSmlPce.otig);
snapeakttSrn()
satevc(net;
trSrieitn)
Aperitivo Osgi, Camel e GWT
92/108
98. Kryo e Benchmark
Si è scelto di utilizzare un’unica classe per tutti i sample (con un campo
b t [ che contiene la serializzazione (Kryo) del sample).
ye]
Sfruttando l’astrazione di JPA sono stati fatti benchmark di occupazione e
performance per supportare le scelte e validare la soluzione.
Aperitivo Osgi, Camel e GWT
98/108
100. Maven ed Eclipse
SensorMix è stato sviluppato in Team utilizzando Maven ed Eclipse.
In particolare:
· Sviluppo GWT integrato nello stesso Java IDE
· Distribuzione tramite Karaf's Features Maven Plugin
· Checkstyle e PMD per migliorare la cooperazione del Team
Aperitivo Osgi, Camel e GWT
100/108
102. Issue su GWT
Serve GWT 2.6.0 che sia reso OSGi ready:
· per favore aiutateci, votate lo issue sulla Osgify di GWT:
- http://goo.gl/GEuVBR
· oppure lo issue su Jira per avere il bundle rilasciato da ServiceMix il prima
possibile:
- http://goo.gl/jFsVcP
104. Libri
Camel in Action
C. Ibsen, J. Anstey - Manning
Enterprise Integration Patterns
G. Hohpe, B. Woolf - Addison Wesley
Spring DM in Action
A. Cogoluègnes, T. Templier, A. Piper - Manning
OSGi in Action
R. S. Hall, K. Pauls, S. McCulloch, D. Savage - Manning
OSGi In depth
Alexandre de Castro Alves - Manning