Nell’articolo precedente abbiamo visto l’implementazione di un servizio SwitchYard. In questa quarta parte passiamo a vederne il deploy e gli aspetti legati alla pubblicazione dei servizi. Concluderemo la nostra serie nel prossimo numero, parlando dei test.
Deploy dell’applicazione su JBoss
Completate la definizione del servizio SwitchYard e l’implementazione della logica applicativa, si passa alla fase di distribuzione. Viene riportato in figura 1 il menu contestuale di esecuzione del progetto SwitchYard in modalità debug sull’application server JBoss definito per il workspace.
Figura 1 – Debug del progetto SwitchYard su JBoss.
Figura 2 – Selezione dell’Application Server di pubblicazione.
Figura 3 – Selezione delle risorse da eseguire sull’Application Server.
Sulla console di Eclipse saranno facilmente individuabili le evidenze di avvio del server e di deploy del modulo:
18:49:00,088 INFO [org.jboss.modules] JBoss Modules version 1.1.1.GA 18:49:00,213 INFO [org.jboss.msc] JBoss MSC version 1.0.2.GA 18:49:00,260 INFO [org.jboss.as] JBAS015899: JBoss AS 7.1.0.Final "Thunder" starting 18:49:00,868 INFO [org.switchyard] SwitchYard version 0.8.0.Final 18:49:00,961 INFO [org.xnio] XNIO Version 3.0.3.GA 18:49:01,757 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-8) Starting Coyote HTTP/1.1 on http-localhost-127.0.0.1-8080 18:49:01,772 INFO [org.jboss.as.remoting] (MSC service thread 1-4) JBAS017100: Listening on localhost/127.0.0.1:4447 18:49:01,772 INFO [org.jboss.as.remoting] ( MSC service thread 1-7) JBAS017100: Listening on /127.0.0.1:9999 18:49:01,772 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-2) JBAS015012: Started FileSystemDeploymentService for directory C:Programmijboss-as-7.1.0standalonedeployments 18:49:01,897 INFO [org.jboss.as.server.deployment] (MSC service thread 1-8) JBAS015876: Starting deployment of "SwitchYardExample_PrenotazioneEsame.jar" 18:49:01,975 INFO [org.jboss.weld.deployer] (MSC service thread 1-4) JBAS016002: Processing weld deployment SwitchYardExample_PrenotazioneEsame.jar 18:49:02,006 INFO [org.jboss.weld.deployer] (MSC service thread 1-3) JBAS016005: Starting Services for CDI deployment: SwitchYardExample_PrenotazioneEsame.jar 18:49:02,053 INFO [org.jboss.weld.Version] (MSC service thread 1-3) WELD-000900 1.1.6 (Final) 18:49:02,053 INFO [org.switchyard] (MSC service thread 1-3) Deploying SwitchYard application 'SwitchYardExample_PrenotazioneEsame.jar' 18:49:02,068 INFO [org.jboss.weld.deployer] (MSC service thread 1-2) JBAS016008: Starting weld service for deployment SwitchYardExample_PrenotazioneEsame.jar 18:49:02,318 INFO [org.switchyard] (MSC service thread 1-2) Starting SwitchYard service 18:49:02,474 INFO [org.apache.camel.management.ManagementStrategyFactory] (MSC service thread 1-2) JMX enabled. 18:49:02,489 INFO [org.switchyard.security.SecurityProvider] (MSC service thread 1-2) Using SecurityProvider implementation: org.switchyard.security.jboss.JBossJaasSecurityProvider 18:49:02,489 INFO [org.switchyard.common.camel.SwitchYardCamelContext] (MSC service thread 1-2) Apache Camel 0.8.0.Final (CamelContext: camel-1) is starting 18:49:02,489 INFO [org.apache.camel.management.DefaultManagementLifecycleStrategy] (MSC service thread 1-2) StatisticsLevel at All so enabling load performance statistics 18:49:02,583 INFO [org.apache.camel.impl.converter.DefaultTypeConverter] (MSC service thread 1-2) Loaded 179 type converters 18:49:02,614 INFO [org.switchyard.common.camel.SwitchYardCamelContext] (MSC service thread 1-2) Total 0 routes, of which 0 is started. 18:49:02,614 INFO [org.switchyard.common.camel.SwitchYardCamelContext] (MSC service thread 1-2) Apache Camel 0.8.0.Final (CamelContext: camel-1) started in 0.125 seconds 18:49:02,614 INFO [org.switchyard.component.sca.deploy.SCAActivator] (MSC service thread 1-2) Unable to resolve cache-container cluster. clustering for will not be available for services and references. 18:49:02,739 INFO [org.apache.camel.impl.converter.DefaultTypeConverter] (MSC service thread 1-2) Loaded 179 type converters 18:49:03,222 INFO [org.switchyard.common.camel.SwitchYardCamelContext] (MSC service thread 1-2) Route: direct:{urn:it.luigibennardis.prenotazioneesami.swy: SWT-servizio-prenotazione-esami:1.0} PrenotazioneEsame started and consuming from: Endpoint[direct://%7Burn:it.luigibennardis.prenotazioneesami.swy: SWT-servizio-prenotazione-esami:1.0%7DPrenotazioneEsame] 18:49:03,331 INFO [org.switchyard.as7.extension.cluster.RemoteEndpointListener] (MSC service thread 1-2) Published Remote Service Endpoint /switchyard-remote 18:49:03,331 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015874: JBoss AS 7.1.0.Final "Thunder" started in 3430ms - Started 207 of 283 services (74 services are passive or on-demand) 18:49:03,363 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "SwitchYardExample_PrenotazioneEsame.jar"
Al di fuori dell’ambiente di sviluppo, la console amministrativa di JBoss mostrerà l’applicazione appena distribuita (figura 4) .
Figura 4 – Applicazioni distribuite in JBoss.
Esposizione del servizio sul protocollo SOAP
Abbiamo quindi descritto lo sviluppo e la pubblicazione di un servizio SwitchYard esposto dal container attraverso la tecnologia SCA. SwitchYard, proprio per la sua natura di Enterprise Service Bus, offre la possibilità di pubblicare lo stesso servizio attraverso una tecnologia diversa.
Figura 5 – Generazione del WSDL corrispondente all’interfaccia del servizio.
Infatti, dovendo risolvere un problema di interoperabilità, si potrà promuovere il Bean di implementazione sull’interfaccia SOAP esponendo in questo modo il servizio come web service.
Figura 6 – Generazione del WSDL: specificazione del folder.
Generare il WSDL
Verrà quindi generato il WSDL corrispondente all’interfaccia Java, attraverso il menu contestuale (figura 5), specificando il folder di destinazione (figura 6) e le opzioni di generazione (figura 7).
Figura 7 – Generazione del WSDL: opzioni di generazione.
La rappresentazione del WSDL generato a partire dall’interfaccia del servizio viene riportata nella figura 8.
Figura 8 – Rappresentazione del WSDL corrispondente al servizio SwitchYard.
Promuovere il servizio
Il passo successivo sarà quello di promuovere il servizio, specificando l’interfaccia di tipo WSDL e il nome che sarà esposto dal container.
Figura 9 – Promozione del servizio sul protocollo SOAP.
Figura 10 – Dettagli del servizio promosso sul protocollo SOAP.
Viene a questo punto proposta la definizione di una classe di trasformazione (figura 11) con le corrispondenti coppie di tipi e di opzioni (figura 12). Si è scelto di implementare la logica di trasformazione tra tipi SOAP e tipi Java, ma sarà possibile utilizzare un framework di trasformazione (JSON, JAXB) , una trasformazione XSL o utilizzare Smooks.
Figura 11 – Definizione della classe di trasformazione.
Figura 12 – Coppie e tipi di trasformazioni.
Viene quindi riportata nella figura 13 l’attualizzazione del servizio una volta ultimata la procedura di pubblicazione sul protocollo SOAP.
Figura 13 – Servizio attualizzato con la pubblicazione SOAP.
XML per dichiarare le trasformazioni
Nel file switchyard.xml di definizione del servizio, le trasformazioni sono dichiarate dai seguenti fragment XML:
<transform:transform.java from="{urn:it.luigibennardis.esb.prenotazioneesami .switchyard:SWT-servizio-prenotazione-esami:1.0}prenotaEsami" to="java:it.luigibennardis.prenotazioneesami.dto.DTOInformazioniEsame" class="it.luigibennardis.prenotazioneesami.trasformazioni.TrasformaSOAP"/> <transform:transform.java from="java:it.luigibennardis.prenotazioneesami.dto.DTODatiPrenotazione" to="{urn:it.luigibennardis.esb.prenotazioneesami .switchyard:SWT-servizio-prenotazione-esami:1.0}prenotaEsamiResponse" class="it.luigibennardis.prenotazioneesami.trasformazioni.TrasformaSOAP"/>
Il primo definisce la trasformazione della request SOAP nella classe Java che corrispondente al tipo DTOInformazioniEsame dichiarato nel metodo prenotaEsami, mentre il secondo definisce la trasformazione del tipo Java DTODatiPrenotazione nella response SOAP.
Funzioni di trasformazione
Viene riportata di seguito la codifica delle funzioni di trasformazione corrispondenti alle dichiarazioni dei fragment illustrati in precedenza. Anche in questo caso l’implementazione non riporta nessun riferimento al container: sarà la direttiva “@Transformer(…)” che verrà utilizzata dal container per eseguire la trasformazione definita nel file di configurazione del servizio.
//CONVERTE UN OGGETTO JAVA DTODatiPrenotazione IN UN PAYLOAD DI OUTPUT @Transformer(to = "{urn:it.luigibennardis.esb.prenotazioneesami.switchyard: SWT-servizio-prenotazione-esami:1.0}prenotaEsamiResponse") public Element transformDTODatiPrenotazioneToPrenotaEsamiResponse( DTODatiPrenotazione from) { try{ StringBuilder ackXml = new StringBuilder().append("<prenotaEsame:getCodiceEsame xmlns_prenotaEsame="urn:it.luigibennardis.esb .prenotazioneesami.switchyard:SWT-servizio-prenotazione-esami:1.0">") .append("" + from.getCodicePrenotazione() + "") .append(""); return Commons.toElement(ackXml.toString()); }catch(Exception ex){ ex.printStackTrace(); return null; } } //CONVERTE IL PAYLOAD DI INPUT IN UN OGGETTO JAVA DTOInformazioniEsame @Transformer(from = "{urn:it.luigibennardis.esb.prenotazioneesami.switchyard: SWT-servizio-prenotazione-esami:1.0}prenotaEsami") public DTOInformazioniEsame transformPrenotaEsamiToDTOInformazioniEsame(Element from) { DTOInformazioniEsame infoPrenEsame = new DTOInformazioniEsame(); DTOStudente infoStudente = new DTOStudente(); DTOEsame infoEsame = new DTOEsame(); try{ //PAYLOAD SOAP CON LE INFORMAZIONI DI STUDENTE ED ESAME DA SOSTENERE /* */ SimpleDateFormat ft = new SimpleDateFormat ("dd/MM/yyyy"); Date dataAppello = null; String appoDateFormat = Commons.getElementValue(from, "dataAppello"); dataAppello = ft.parse(appoDateFormat); //***INFORMAZIONI ESAME DAL PAYLOAD SOAP infoEsame.setCodice(Commons.getElementValue(from, "codice")); infoEsame.setDataAppello(dataAppello); infoEsame.setDescrizione(Commons.getElementValue(from, "descrizione")); //***INFORMAZIONI STUDENTE DAL PAYLOAD SOAP infoStudente.setNome(Commons.getElementValue(from, "nome")); infoStudente.setCognome(Commons.getElementValue(from, "cognome")); infoStudente.setMatricola(Commons.getElementValue(from, "matricola")); infoPrenEsame.setEsame(infoEsame); infoPrenEsame.setStudente(infoStudente); }catch (Exception ex) { ex.printStackTrace(); return null; } return infoPrenEsame; }
Nuovo aspetto di binding
Una volta pubblicato il servizio, in questo caso esposto dal container anche sul protocollo SOAP, la console di output di JBoss evidenzierà (figura 14) il nuovo aspetto di binding: il WSDL corrispondente alla pubblicazione del servizio come web service.
Figura 14 – Pubblicazione del servizio SwitchYard sul protocollo SOAP.
Sempre a livello di configurazione del descrittore del servizio SwitchYard sarà anche possibile abilitare la tracciatura dei messaggi SOAP (figura 15) sulla console di JBoss (figura 16).
Figura 15 – Abilitazione della tracciatura dei messaggi SOAP.
Figura 16 – Tracciatura di una request SOAP verso SwitchYard.
Concluso lo sviluppo del servizio SwitchYard pubblicato sull’interfaccia SCA e SOAP, verranno implementati i corrispondenti client dimostrativi dell’utilizzo di queste due tecnologie di binding.
Conclusioni
In questo articolo abbiamo visto le operazioni necessarie al deploy e alla distribuzione del nostro servizio SwitchYard, presentando diverse possibilità di pubblicazione. Siamo giunti quasi alla fine del nostro percorso, ma manca ancora un tassello importante: i test, che vedremo il prossimo mese, nell’articolo conclusivo.