Download service

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
AXIS
Master MIAGE/SID – Université
NANCY2
A. Roussanaly - Université Nancy2
Généralités
Open source de Apache Software Foundation
Moteur SOAP
Compatible JAX-RPC
Distribué avec des outils de développement et
de monitoring
Accompagné de documentation et d'exemples
A. Roussanaly - Université Nancy2
Architecture JAX-RPC
CLIENT
WSDL
SERVICE
JAX-RPC
JAX-RPC
API Client
API Serveur
SOAP
HTTP
A. Roussanaly - Université Nancy2
Architecture Axis
La Servlet AxisServlet reçoit et
renvoie les messages SOAP et
transmet aux objets Java
correspondant
SOAP/HTTP
D'après Xavier Blanc
Les Objets Java effectuent
les services. Ils sont des
objets Java classiques.
AxisServlet
Moteur de Servlet
Le client envoie
des messages
SOAP/HTTP
JVM
Objets Java et Servlet sont dans la
même JVM (pas de répartition).
A. Roussanaly - Université Nancy2
Axis2
Archives au format .aar
SOAP/HTTP
AxisServlet
Moteur de Servlet
JVM
A. Roussanaly - Université Nancy2
Activité : développer un serveur
Développer un serveur qui fournit le change de
différentes monnaies par rapport au DM
Ecrire ensuite une application de conversion de
monnaies (client)
Exemple d’opérations:
getDollar()
getFrancSuisse()
getLivre()
getYen()
A. Roussanaly - Université Nancy2
ARCHIVES
A. Roussanaly - Université Nancy2
Créer un service web avec
Axis2…
…et Eclipse for J2EE developper
A. Roussanaly - Université Nancy2
Configuration
A. Roussanaly - Université Nancy2
Créer un projet
A. Roussanaly - Université Nancy2
Ajouter automatiquement les jar de
Axis2 dans lib
A. Roussanaly - Université Nancy2
A. Roussanaly - Université Nancy2
A. Roussanaly - Université Nancy2
Créer une classe
A. Roussanaly - Université Nancy2
Générer le WS
A. Roussanaly - Université Nancy2
A. Roussanaly - Université Nancy2
A. Roussanaly - Université Nancy2
A. Roussanaly - Université Nancy2
A. Roussanaly - Université Nancy2
Tester le service
A. Roussanaly - Université Nancy2
Axis
Ecriture d’un serveur
A. Roussanaly - Université Nancy2
Projet Eclipse/Tomcat
axis-change
WEB-INF
build.xml
src
project.properties
deploy.wsdd
undeploy.wsdd
index.jsp…
fr.miage.sid.axis.server
.java
A. Roussanaly - Université Nancy2
web.xml
server-config.wsdd
perms.lst
users.lst…
lib
classes
.class
<ext-jars>
axis.jar
axis-ant.jar
wsdl4j.jar
mail.jar
activation.jar…
Properties
name=poub
version=1.0
year=2006
debug=on
deploy.file=deploy.wsdd
undeploy.file=undeploy.wsdd
service.host=localhost
service.port=80
service.package=fr.miage.sid.axis.server
A. Roussanaly - Université Nancy2
Service « rapide »
 Dans un premier temps, il nous faut un service ;
Axis permet d’en créer de manière très rapide.
 Pour notre application, nous allons créer un service qui
nous permet d’obtenir le cours de différentes monnaies en
euro.
 Exemple d’opérations:
 getDollar()
 getFrancSuisse()
 getLivre()
 getYen()
A. Roussanaly - Université Nancy2
Change : service
Créer un programme source java
exemple : une classe Change qui fournit le taux
de change de l’USD, CHF, JPY, GBP
Modifier l'extension .java du fichier source en .jws
Déployer le fichier .jws
copie dans %tomcat%\webapps\axis
A. Roussanaly - Université Nancy2
Listing : Change.jws
public class Change {
private double EU_USD = 1.251;
private double EU_CHF = 1.592;
private double EU_JPY = 149.00;
private double EU_GBP = 0.670;
public double getDollar(){return EU_USD;}
public double getFrancSuisse(){return EU_CHF;}
public double getYen(){return EU_JPY;}
public double getLivre(){return EU_GBP;}
}
A. Roussanaly - Université Nancy2
Test du service Change
Examiner sa description WSDL
 http://localhost:8080/axis/Change.jws?wsdl
Enregistrer le fichier WSDL dans un projet
Eclipse
Exemple : change.wsdl
Tester ce service avec les outils Eclipse/WTP
Menu contextuel Web Services sur change.wsdl
et Test with Web services Explorer…
A. Roussanaly - Université Nancy2
Change : client
On peut maintenant écrire une application cliente
du service change.
Par exemple, un convertisseur de monnaie :
A. Roussanaly - Université Nancy2
Ecriture « normale » d’un service
Usage des fichiers JWS limité :
Obligation de travailler avec le code source
Pas de possibilité de mappings
Pas de possibilité de contrôle avec un handler
On est donc amené à déployer des classes (ou
éventuellement des jars)
A. Roussanaly - Université Nancy2
Ecriture « normale » d’un service
 Le point de départ peut être :
1. un fichier WSDL :
 On utilise alors l’outil WSDL2JAVA pour
engendrer le « squelette » d’un serveur (skeleton)
2. une classe JAVA :
 Le fichier WSDL est dynamiquement engendré
par le servlet Axis
A. Roussanaly - Université Nancy2
Etapes
1. Développer le service et l’intégrer dans un projet
Tomcat contenant le servlet Axis (autrement dit
déployer le servlet Axis sous Tomcat)
2. A l’aide d’un fichier de descripteur de
déploiement (WSDD) propre à Axis, déployer le
service Axis
 Il s’agit de mettre à jour le fichier de configuration
server-config.wsdd qui se trouve dans le dossier
WEB-INF d’Axis
 On utilise l’outil AdminClient d’Axis
A. Roussanaly - Université Nancy2
Ant
<taskdef name="axis-admin"
classname="org.apache.axis.tools.ant.axis.AdminClientTask">
<classpath refid="classpath" />
</taskdef>
<target name="deployer" description="Déploiement du serveur">
<axis-admin port="${service.port}"
hostname="${service.host}" failonerror="true"
servletpath="${name}/services/AdminService" debug="true"
xmlfile="${deploy.file}" />
</target>
A. Roussanaly - Université Nancy2
WSDD
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="change" provider="java:RPC">
<parameter name="className" value="fr.miage.sid.axis.server.Change"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
A. Roussanaly - Université Nancy2
Explications
 L’outil AdminClient s’appuie (1) sur les informations
contenues dans le fichier WSDD et (2) sur les arguments
passés en paramètres (host, port, axis-root)
 axis.jar et axis-ant.jar doivent être dans le classpath.
 Axis crée un servive appelé
 http://<host>:<port>/<axis-root>/services/<service-name>
 Le WSDL du service is accessible à
 http://<host>:<port>/<axis-root>/services/<service-name>?wsdl
 Une liste des services est visible à
 http://<host>:<port>/<axis-root>/services
A. Roussanaly - Université Nancy2
WSDD avancée
Scope
<service name=<service>...>
<parameter name="scope" value=<valeur>/> ...
</service>
<valeur> :
 "Request"
 "Session"
 "Application"
A. Roussanaly - Université Nancy2
Annexes
(archives)
A. Roussanaly - Université Nancy2
Exemple client n°1 (DII)
public
String endPoint = "http://localhost:8080/axis/AddFunction.jws";
public
String operationName = "addInt";
public int invokeService(int a, int b) throws Exception{
Service service = new Service();
Call
call
= (Call) service.createCall();
call.setOperationName(new QName(endPoint, operationName));
call.setTargetEndpointAddress( new URL(endPoint) );
Integer ret = (Integer) call.invoke(
new Object[] { new Integer(a), new Integer(b)} );
return ret.intValue();
}
A. Roussanaly - Université Nancy2
Exemple client n°2 (PROXY)
public
public
public
public
String
String
String
String
wsdlUrl = "http://localhost:8080/axis/AddFunction.jws?wsdl";
nameSpaceUri = "http://localhost:8080/axis/AddFunction.jws";
serviceName = "AddFunctionService";
portName = "AddFunction";
public int invokeService(int a, int b) throws Exception{
ServiceFactory serviceFactory = ServiceFactory.newInstance();
Service afService = serviceFactory.createService(
new URL(wsdlUrl), new QName(nameSpaceUri, serviceName));
AddFunctionServiceIntf afsIntf =(AddFunctionServiceIntf)afService
.getPort(new QName(nameSpaceUri, portName),
AddFunctionServiceIntf.class);
return afsIntf.addInt(a, b);
}
A. Roussanaly - Université Nancy2
Exemple client n°2 (PROXY)
public interface AddFunctionServiceIntf extends java.rmi.Remote {
public int addInt(int a, int b) throws java.rmi.RemoteException;
}
A. Roussanaly - Université Nancy2
Exemple client n°3 (STUB)
Générer préalablement le stub à l'aide de l'outil WSDL2Java
public int invokeService(int a, int b) throws Exception{
AddFunctionService afs = new AddFunctionServiceLocator();
AddFunction af = afs.getAddFunction();
return af.addInt(a, b);
}
A. Roussanaly - Université Nancy2
Déploiement de service
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="MyService" provider="java:RPC">
<parameter name="className" value="samples.userguide.example3.MyService"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
%java org.apache.axis.client.AdminClient MyService.wsdd
A. Roussanaly - Université Nancy2
Axis
Ecriture d’un client
A. Roussanaly - Université Nancy2
Ecriture d'un client
 On a le choix entre 3 méthodes :
 Proxy
• Cas d’utilisation : type des paramètres et résultat connus (voir
exemple annexe de présentation)
 Interface d'invocation dynamique (DII) :
• Cas d’utilisation : on ne connaît que l’url du service =>
invocation dynamique des méthodes (voir exemple annexe de
présentation)
 Génération d'un Stub à partir d'une description WSDL
• Cas d’utilisation : connaissance préalable du WSDL
• On se place dans ce cas dans la suite…
A. Roussanaly - Université Nancy2
Synopsis de l’application
WSDL2JAVA
Change.wsdl
Change.java
ChangeService.java
ChangeServiceLocator
ChangeSoapBindindStub.java
JAVAC
UI.java
Convertisseur.java
A. Roussanaly - Université Nancy2
Projet Eclipse
ChangeAxisClient
build.xml
project.properties
lib
src
bin
.class
img
fr.miage.sid.axis.client
.jpg
.java
stub
.java
(wsdl2java)
A. Roussanaly - Université Nancy2
axis.jar
axis-ant.jar
wsdl4j.jar
mail.jar
activation.jar…
Ant
<project default="compiler" basedir=".">
<!-- Variable d'accès aux variables d'environnement -->
<property environment="env" />
<!-- Accès aux variables locales du projet -->
<property file="project.properties" />
<!-- Où se trouvent les jar -->
<property name="lib.dir" value="lib" />
<!-- Où se trouvent les src -->
<property name="src.dir" value="src" />
<!-- Où se trouvent les img -->
<property name="img.dir" value="${src.dir}/img" />
<!-- Où se trouvent les class -->
<property name="bin.dir" value="bin" />
<!-- Où se trouvent les javadoc -->
<property name="javadoc.dir" value="${bin.dir}/javadoc" />
…
</project>
A. Roussanaly - Université Nancy2
Ant
<!-- Definition de la tache ant wsdl2java -->
<taskdef name="wsdl2java"
classname="org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask">
<classpath refid="classpath" />
</taskdef>
A. Roussanaly - Université Nancy2
Ant
<!--
====================================================================
Créer un stub avec wsdl2java
====================================================================
-->
<target name="wsdl2java"
description="Génération d'un stub (client)">
<wsdl2java url="${wsdl.file}" output="${src.dir}">
<mapping namespace="${service.urn}" package="${service.package}"/>
</wsdl2java>
</target>
A. Roussanaly - Université Nancy2