ESB con SwitchYard JBoss

IV parte: Deploy dell'applicazionedi

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.

 

Riferimenti

[1] SwitchYard

http://www.jboss.org/switchyard

https://docs.jboss.org/author/display/SWITCHYARD/Home

http://searchsoa.techtarget.com/feature/Red-Hat-makes-a-switch-SwitchYard-project-to-replace-JBoss-ESB

 

[2] ESB

http://en.wikipedia.org/wiki/Enterprise_service_bus

 

[3] jUDDI

http://juddi.apache.org

 

[4] jBPM

http://www.jbpm.org/

 

[5] BPMN

http://www.bpmn.org/

 

[6] Weld - CDI Reference Implementation

http://docs.jboss.org/weld/reference/latest/en-US/html/

 

[7] CDI

http://docs.oracle.com/javaee/6/tutorial/doc/giwhl.html

 

[8] Drools

http://www.drools.org/

 

[9] Apache Camel

http://camel.apache.org/

 

[10 ]EIP

http://www.enterpriseintegrationpatterns.com/

 

[11] David Chappell, "Enterprise Service Bus", O'Reilly, 2004

 

[12] Binildas C. A., "Enterprise Service Bus integration solutions for Java developers", Packt Publishing, 2008

 

[13] SCA Service Component Architecture

http://en.wikipedia.org/wiki/Service_Component_Architecture

https://docs.jboss.org/author/display/SWITCHYARD08/SCA

 

[14] Oasis

http://docs.oasis-open.org/ns/opencsa/sca/200912

 

Condividi

Pubblicato nel numero
203 febbraio 2015
Luigi Bennardis si è laureato in Scienze Statistiche ed Economiche all’università di Roma e si occupa di informatica da diversi anni. Dopo una lunga esperienza di system integration su piattaforma Java EE e Microsoft in una importante società di consulenza, attualmente si occupa di progettazione e sviluppo su tecnologie distribuite…
Articoli nella stessa serie
Ti potrebbe interessare anche