Java e .NET Web Services Interoperability su Windows Azure

Nei mesi scorsi con un gruppo di lavoro del Prof. Carlo Maria Medaglia del CATTID (LaSapienza) abbiamo lavorato congiuntamente ad un laboratorio di interoperabilità tra Web Services con Java e .NET sfruttando Windows Azure come piattaforma per il deployment dei servizi (sia Java che .NET).

Il team del progetto, lato CATTID, è composto da Fabio Lombardi (DEV), Alessandro Marrone(DEV) e Andrea Ingrosso (PM).

In questo post Fabio, Alessandro ed Andrea illustrano passo passo la creazione di web services con JAVA, Tomcat e AXIS2 interoperabili con .NET e il successivo deployment su Windows Azure con Tomcat.

Prossimamente verrà pubblicato l’aggiornamento alle novità introdotte dal nuovo Windows Azure SDK 1.6 lato JAVA.

 

Introduzione

Per utilizzare gli script che stiamo andando ad elencare ed analizzare è necessario avere installato:

· Framework .NET 4.0

· Windows Azure SDK 1.4 (o superiore)

· Java JDK 1.5 (o superiore)

· Eclipse IDE for Java EE Developers

· Apache Tomcat Binary

· Apache Axis 2 Binary

Per comprendere come utilizzare Eclipse con Windows Azure e capire come portare Tomcat sul Cloud potete leggere la seguente guida:

Deploying a Java application to Windows Azure with Eclipse

Apprese le nozioni principali possiamo vedere come realizzare un semplice web service che offre un servizio di infomobilità:

clip_image002

Figura 1: Pila Software

 

Cos’è Axis2

Apache Axis2 è un'implementazione Java sia lato client che server del paradigma Web Service. Fornisce un'architettura modulare che rende semplice l'aggiunta di funzionalità ed il supporto di nuove specifiche per i web service.

Permette:
- l'invio di messaggi SOAP
- la ricezione ed il processamento di messaggi SOAP
- la creazione di classi sia per il server che per il client attraverso WSDL
- il recupero del WSDL di un servizio
- la creazione e l'utilizzo di Web service REST
- la creazione e l'utilizzo di web service che implementano le specifiche WS-Security, WS- ReliableMessaging, WS-Addressing, WS-Coordination e WS-Atomic Transaction

 

Creazione di un web service

Vediamo come creare un web service con Axis2 e portarlo sulla nuvola.

Creare con Eclipse un Dynamic Web Project da File → New → Other → Web → Dynamic Web Project (Fig.2).

clip_image002[4]

Figura 2

Dalla sezione Configuration (Fig.3) clicchiamo su Modify. Impostiamo la versione del Dynamic web module alla 2.5 e selezioniamo Axis2 Web Services:

clip_image002[9]

Figura 3

Creaiamo una cartella di nome WSDL nella root del progetto ed importare i file MobilityMessages.xsd e MobilityService.wsdl(Fig.4) scaricabili dai seguenti link:

https://devlab.devleap.it/MISM/MobilityService.wsdl
https://devlab.devleap.it/MISM/MobilityMessages.xsd

 

clip_image002[9]

Figura 4

Se non è presente l'auto build, compilare il progetto.

Creiamo il Web Service (Fig. 5), selezionando il file MobilityService.wsdl, File → New → Other → Web Services → Web Service.

clip_image002[11]

Figura 5

Portando la barra di scorrimento fino al livello Test Service possiamo testare il servizio creato con il tool Web Services Explorer (Fig. 6).

clip_image002[13]

Figura 6

Assicurarsi che:

  • Il server runtime selezionato sia Tomcat v7.0 Server,
  • Come Web Service runtime sia selezionato Apache Axis2,
  • Come Service project sia selezionato Axis2WSTest.

A questo punto sono state generate tutte le classi necessarie per mettere in piedi un semplice servizio di infomobilità. Nel package mobi.mism.schemas.messages.mobility, troviamo tutte le classi per i modelli dei dati e per gestire le risposte e le richieste al web service.
Nel package mobi.mism.services.mobilityservice contiene la classe MobilityServiceSkeleton che definisce gli endpoint del servizio (Fig. 7).

clip_image002[15]

Figura 7

Per completare il web service dobbiamo finire di implementare gli endpoint. Di seguito una semplice implementazione:

 
 

public mobi.mism.schemas.messages.mobility.GetScheduledTimeResponse getScheduledTime ( mobi.mism.schemas.messages.mobility.GetScheduledTimeRequest getScheduledTimeRequest ) { //TODO : fill this with the necessary business logic Time timeResponse = new Time(); GetScheduledTimeResponse scheduleTimeResponse= new GetScheduledTimeResponse();

timeResponse.setValue(Calendar.getInstance()); scheduleTimeResponse.setGetScheduledTimeResponse(timeResponse); return scheduleTimeResponse;

}

 
 

public mobi.mism.schemas.messages.mobility.GetLineDelayResponse getLineDelay ( mobi.mism.schemas.messages.mobility.GetLineDelayRequest getLineDelayRequest ) { //TODO : fill this with the necessary business logic GetLineDelayResponse lineDelayResponse = new GetLineDelayResponse(); Delay delayResponse = new Delay(); delayResponse.setMinutes((int) (Math.random() * 15)); lineDelayResponse.setGetLineDelayResponse(delayResponse); return lineDelayResponse; }

 
 

public mobi.mism.schemas.messages.mobility.GetExpectedTimeResponse getExpectedTime ( mobi.mism.schemas.messages.mobility.GetExpectedTimeRequest getExpectedTimeRequest ) { //TODO : fill this with the necessary business logic Time timeResponse = new Time(); GetExpectedTimeResponse expectedTimeResponse= new GetExpectedTimeResponse(); timeResponse.setValue(Calendar.getInstance()); expectedTimeResponse.setGetExpectedTimeResponse(timeResponse);

return expectedTimeResponse;

}

Compiliamo e testiamo il progetto con il tool Web Services Explorer (Fig. 8).

clip_image002[17]

Figura 8

 

Creare il progetto Cloud

Nella guida Deploying a Java application to Windows Azure with Eclipse abbiamo visto come creare un progetto per Windows Azure con Apache Tomcat.
Ora vedremo gli ultimi passi per importare anche il nostro progetto con axis2 sul cloud.

  • Esportare il progetto come Axis2WSTest.war.
  • Creare un progetto Cloud , Axis2_on_Cloud, da File New->OtheràWindows Azure Projectà Windows Azure Project (Fig. 9)

 

clip_image002[19]

Figura 9

Copiare una versione di Tomcat, Jre e Axis2WSTest.war nella cartella approot del progetto (Fig. 10).

clip_image002[21]

Figura 10

Modificare il file util\startup.cmd come segue in modo da copiare le cartelle di Tomcat e JRE ed avviarli.

 
 

@REM unzip Tomcat

cscript /B /Nologo util\unzip.vbs Tomcat\apache-tomcat-7.0.12-windows-x64.zip .

@REM unzip JRE

cscript /B /Nologo util\unzip.vbs JRE\jre6.zip .

@REM copy project files to server

copy Axis2WSTest.war "apache-tomcat-7.0.12-windows-x64\webapps"

@REM start the server

cd "apache-tomcat-7.0.12-windows-x64\bin"

set JRE_HOME=..\..\jre6

startup.bat

A questo punto non resta che compilare il progetto e effettuare l’upload sulla piattaforma AZURE.

 

Deployment del servizio sul cloud

Se si è in possesso di un account Windows Azure, è possibile ospitare la soluzione appena implementata sul cloud. Per conoscere come testare gratuitamente il web service potete leggere 7 modi per usare o provare Windows Azure GRATIS.

Prima di tutto è necessario effettuare una modifica nel file Axis2_on_Cloud à WorkerRole1 à package.xml.

<windowsazurepackage configurationfilename="ServiceConfiguration.cscfg"

definitionfilename="ServiceDefinition.csdef" packagedir="${wapackagedir}"

packagefilename="WindowsAzurePackage.cspkg" packagetype="cloud"

projectdir="${basedir}" sdkdir="${wasdkdir}">

Si deve sostituire il valore dell’attributo packagetype, local, dell’elemento windowsazurepackage con il valore cloud, in modo tale che il package generato sarà ospitabile dal cloud invece che essere eseguito nell’ambiente di simulazione di Windows Azure (development fabric).

Successivamente si deve creare un nuovo “Hosted Service” cliccando appunto su Nuovo servizio ospitato nella home page del portale (Fig. 11).

clip_image002[23]

Figura 11

Come in figura inseriamo il nome del servizio, Url, la regione, il nome della distribuzione e il percorso del pacchetto di deployment.

Il pacchetto che è stato generato dal build della soluzione Eclipse con le modifiche sopra descritte, Axis2_on_Cloud –> deploy –> WindowsAzurePackage.cspkg, ed il file di configurazione Axis2_on_Cloud –> deploy –>ServiceConfiguration.cscfg

Creazione di un web service client on-premises

Creiamo un client che chiama il web service ospitato sul cloud, File → New → Other → Web Services → Web Service Client (Fig. 12):

clip_image002[25]

Figura 12

Portiamo la barra di scorrimento fino al livello Test Service e assicurarsi che come (Fig. 13):

  • Server runtime sia selezionato Tomcat v7.0 Server,
  • Web Service runtime sia selezionato Apache Axis2

clip_image002[27]

Figura 13

Clicchiamo sul link Client Project nel box Configuration e inserisci come nome del progetto Axis2WSTestClient (Fig. 14):

clip_image002[29]

Figura 14

Clicchiamo su OK e Finish. Verrà generato il package mobi.mism.services.mobilityservice che contiene le classi necessarie per far comunicare il nostro client con il web service (Fig. 15).

clip_image002[31]

Figura 15

Non ci resta che implementare il client:

Creiamo il file WebContent\index.html ed inseriamo la seguente form:

 
 

<hr/>Chiamata a getLineDelay<br/>

<form method = 'POST' action = 'lineDelay.jsp'>

Inserisci il numero della linea: <input type = 'text' name = 'inputNumber'/>

<input type = 'submit' value = 'Invia'/>

</form>

Creiamo il file WebContent\lineDelay.jsp, che contiene la logica per dialogare con il web service:

<html>

<head>

<%@ page import="mobi.mism.services.mobilityservice.*" %>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Ritardo Bus</title>

</head>

<body>

<%! private int numberLine, delay; %>

<%

String inputString = request.getParameter("inputNumber");

if (inputString != null) {

numberLine = Integer.parseInt(inputString.trim());

}

//Crea lo stub

MobilityServiceStub stub = new MobilityServiceStub("https://<url.cloudapp.net> /Axis2WSTest/services/MobilityService");

//Crea la request

MobilityServiceStub.Line line = new MobilityServiceStub.Line();

line.setName(""+numberLine);

//Invoca il Web Service

MobilityServiceStub.GetLineDelayRequest req = new MobilityServiceStub.GetLineDelayRequest();

req.setGetLineDelayRequest(line);

//Recupera il risultato

MobilityServiceStub.GetLineDelayResponse ldr = stub.getLineDelay(req);

%>

<p>Numero linea <%= numberLine %> il ritardo è di: <%= ldr.getGetLineDelayResponse().getMinutes() %> min.</p>

<a href = 'index.html'>Indietro</a>

</body>

</html>

MobilityServiceStub(url-servizio); l’url del servizio può essere recuperato da home_axis2àServices (Fig. 16)

clip_image002[33]

Figura 16

Similmente possono essere implementati gli altri due servizi (Fig. 17/18).

clip_image002[35]

Figura 17

clip_image002[37]

Figura 18

 

Fabio, Alessandro, Andrea

CATTID – Roma