Url Link

Développer des services Web avec JCMS et Jakarta Axis

In brief...
Les services Web permettent de faire interagir des applications hétérogènes. Cet article décrit l'utilisation des services Web dans JCMS et donne des exemples de mise en oeuvre avec la bibliothèque Jakarta Axis.
Subject Integration & Compatibility
Intégration
Products JCMS
Published 7/12/06
Writer Benoit Dissert

1. Introduction

Les services Web offrent la possibilité de faire des requêtes, des envois de messages et de définir des protocoles d’échanges entre des systèmes distribués.

Parmi les avantages des services Web par rapport à d’autres mécanismes on peut retenir :

  • ils reposent sur le protocole HTTP ;
  • le format des requêtes est en XML ;
  • les entrées et sorties sont spécifiées par une unique ressource XML : le WSDL ;
  • ils sont indépendants d'un langage de programmation pourvu que ce langage dispose d'API qui lui permettent de parser du XML, de produire des requêtes HTTP et de fournir des ressources HTTP ;
  • la plupart des langages (et c’est le cas en Java) disposent d'API facilitant la production et la consommation des services Web.

Il est souvent pertinent dans le cas d'une intégration entre JCMS et un autre système d'information d'utiliser des services Web.

Cet article présente des exemples très simples de consommation et de production de services Web avec JCMS.

2. Principes

Les services Web reposent sur le modèle client/serveur. On dit que le serveur produit des services Web et que le client les consomme.

Pour faciliter la manipulation de services Web, nous allons utiliser la librairie Axis, un projet Jakarta qui implémente la couche SOAP

Pour la consommation, nous allons utiliser un programme d’Axis, appelé WSDL2Java. Ce programme créé automatiquement, à partir d’une ressource WSDL, un ensemble de classes Java. Il ne reste plus qu’à utiliser ces classes Java dans le contexte applicatif pour interroger le service web.

Pour la production, nous allons utiliser une servlet d’Axis qui produit automatiquement des services Web à partir d’une classe Java.

3. Mises en œuvre

3.1 Utilisation de Axis dans JCMS

Récupérer la version distribuée avec les sources de Axis sur le site de Jakarta (nous utilisons ici la version 1.4 de Axis pour Java). Déployer par ailleurs JCMS (nous utilisons la version 5.6, mais cela est valable avec toutes les versions de JCMS). Pour l'exemple, nous déployons JCMS dans un Tomcat (en version 5.0.28).

Pour fixer les idées, nous avons décompressé Tomcat et Axis dans un même répertoire D:\FCB_WS\ et installé JCMS dans le répertoire webapps de Tomcat sans modifier le nom de la webapp (jcms-5.6.0-ee-fr).

Copier les librairies suivantes de D:\FCB_WS\axis-1_4\lib dans D:\FCB_WS\jakarta-tomcat-5.0.28\webapps\jcms-5.6.0-ee-fr\WEB-INF\lib :

  • axis.jar
  • commons-discovery-0.2.jar
  • jaxrpc.jar
  • saaj.jar
  • wsdl4j-1.5.1.jar

La liste de ces librairies est valable avec JCMS 5.6, avec les versions antérieures, il faut faire attention que commons-logging et log4J soient présents.

Editer le fichier D:\FCB_WS\jakarta-tomcat-5.0.28\webapps\jcms-5.6.0-ee-fr\WEB-INF\web.xml et ajoutez les lignes suivantes :

<servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>*.jws</url-pattern>
</servlet-mapping>

Dans la section des servlets mapping, et les lignes suivantes :

<listener>
  <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>

<!-- SERVLETs -->

<servlet>
  <servlet-name>AxisServlet</servlet-name>
  <display-name>Apache-Axis Servlet</display-name>
  <servlet-class>
    org.apache.axis.transport.http.AxisServlet
  </servlet-class>
</servlet>

à la place de la ligne :

<!-- SERVLETs -->

3.2 Consommation de services Web externes

Tout d’abord, trouvons un service web que l’on puisse utiliser. Il est possible de trouver sur Internet différents services Web à utiliser pour des tests. Pour l'exemple, nous allons utiliser un service web de géolocalisation en fonction d’une adresse IP que l’on donne en paramètre (en l'occurence nous donnerons celle de www.jalios.com : 212.43.236.22). Les informations concernant ce service web sont disponibles à l’adresse suivante :

  http://www.webservicex.net/ws/WSDetails.aspx?CATID=12&WSID=64

On peut entre autre récupérer l’adresse du WSDL :

  http://www.webservicex.net/geoipservice.asmx?WSDL

Lancer JCMS et accédez à :

  http://127.0.0.1:8080/jcms-5.6.0-ee-fr/admin/classpath.jsp.

Copier le texte obtenu dans un fichier

D:\FCB_WS\WSDL2Java.bat

puis ajouter, à la fin, les lignes suivantes :

set CLASSPATH=%CLASSPATH%;D:\FCB_WS\axis-1_4\lib\endorsed\xml-apis-2.6.2.jar

java org.apache.axis.wsdl.WSDL2Java -o D:\FCB_WS\jakarta-tomcat-5.0.28\webapps\jcms-5.6.0-ee-fr\WEB-INF\classes http://www.webservicex.net/geoipservice.asmx?WSDL

Enregistrer le fichier. Aller dans une invite de commande DOS, et lancer ce fichier bat.

Cela doit vous produire, dans le répertoire WEB-INF\classes\ de la webapp, un ensemble de classes java :

  • net.webservicex.www.GeoIP ;
  • net.webservicex.www.GeoIPService ;
  • net.webservicex.www.GeoIPServiceLocator ;
  • net.webservicex.www.GeoIPServiceSoap ;
  • net.webservicex.www.GeoIPServiceSoapStub.

Créer la JSP : "custom\webservices\geoLocalisation.jsp" contenant le code suivant :

<%@ include file='/jcore/doInitPage.jsp' %>
<%@ page import="org.apache.axis.client.Call,org.apache.axis.client.Service,javax.xml.namespace.QName,net.webservicex.www.*" %>

<div style="margin: 10px;">

<%
String inputIP = request.getParameter("IP");
if ( Util.notEmpty(inputIP) ) {
  GeoIPService service = new GeoIPServiceLocator();
  GeoIPServiceSoap serviceSOAP = service.getGeoIPServiceSoap();
  GeoIP geoIP = serviceSOAP.getGeoIP(inputIP);
%>
IP : <%= inputIP %> <br/>
<%= geoIP.getCountryName() %>
<% } // fin du if inputIP %>

<div>
<form action="display.jsp" method="GET">
<%
List listExcludedParams = new ArrayList();
listExcludedParams.add("IP");
%>
<%= printDisabledHiddenParams(request, listExcludedParams) %>
<input name="IP" type="text" />
<input type="submit"/>
</form>
</div>

</div>

Ajouter dans le portail par défaut de JCMS, une portlet JSP qui pointe vers cette JSP. On peut alors saisir des adresses IP, la portlet nous affiche le pays dans lequel elle est enregistrée.

                       PortletGeoLocalisation1

3.3 Production de services Web

Nous allons produire un service web qui renvoie le nombre de millisecondes depuis le dernier redémarrage. Cela peut être utile pour une application de monitoring.

Créer ce fichier (l'extension "jws" signifie "Java Web Service") :

  D:\FCB_WS\jakarta-tomcat-5.0.28\webapps\jcms-5.6.0-ee-fr\custom\webservices\Uptime.jws

Voici le contenu de ce fichier :

import java.util.Date; 
import com.jalios.jcms.Channel;
import com.jalios.util.Util;
import javax.servlet.ServletContext; 
public class Uptime {            
  /**       
   * @return nombre de millisecondes depuis le dernier redemarrage.       
   */      
  public long uptime() {        
    ServletContext context = Channel.getChannel().getServletContext();        
    if ( null == context ) {          
      return 0;        
    }        
    Date restartDate = ((Date)context.getAttribute("channelLastRestart"));        
    if ( null == restartDate ) {          
      return 0;        
    }                    
    return System.currentTimeMillis() - restartDate.getTime();      
  } 
}

Il s’agit du code d’une classe Java Uptime.java, qui a été renommé en Uptime.jws. Vous remarquerez qu’en tant que classe, celle-ci n’est pas dans un package, et que la méthode "uptime" est publique.

Dans un navigateur, accédez maintenant à l’URL suivante : http://127.0.0.1:8080/jcms-5.6.0-ee-fr/custom/webservices/Uptime.jws.

Il y a un message indiquant qu’un service web est disponible à cette adresse et propose d’accéder au WSDL définissant ce service web.

Le service web est disponible, voici son WSDL :

 ProductionWS2

4. Conclusion

Au travers de cet article, nous avons utilisé et produit des services Web avec JCMS, sans avoir à connaître même la structure d’un fichier XML, même si cela facilite la compréhension.

En suivant les exemples ci-dessus, on peut réaliser facilement des intégrations entre systèmes distribués. Dans un contexte réel, il y a au moins deux préoccupations supplémentaires à prendre en compte : l'authentification du système distant et le cas où le système distant est défaillant.

Références :


Member Discussions

    Title First post Last post Writer #Messages
1. Localisation WSDL pour Uptime ? 1/28/08 5:09 PM 1/29/08 11:25 AM Sébastien Guillomon 4
2. services web 1/4/08 7:18 PM 1/29/08 11:09 AM mohamed amine benfreha 4
3. Classes java obtenues différentes 9/28/06 2:25 PM 10/10/06 2:59 PM Jean-Paul Rokicki 2

Login   Home   fr en
JALIOS SA - SIREN 440 126 035