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.
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à:
Figura 1: Pila Software
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
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).
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:
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:
http://devlab.devleap.it/MISM/MobilityService.wsdl http://devlab.devleap.it/MISM/MobilityMessages.xsd
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.
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).
Figura 6
Assicurarsi che:
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).
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).
Figura 8
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.
Figura 9
Copiare una versione di Tomcat, Jre e Axis2WSTest.war nella cartella approot del progetto (Fig. 10).
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.
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).
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
Creiamo un client che chiama il web service ospitato sul cloud, File → New → Other → Web Services → Web Service Client (Fig. 12):
Figura 12
Portiamo la barra di scorrimento fino al livello Test Service e assicurarsi che come (Fig. 13):
Figura 13
Clicchiamo sul link Client Project nel box Configuration e inserisci come nome del progetto Axis2WSTestClient (Fig. 14):
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).
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("http://<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)
Figura 16
Similmente possono essere implementati gli altri due servizi (Fig. 17/18).
Figura 17
Figura 18
Fabio, Alessandro, Andrea
CATTID – Roma