Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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