Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Arnaud CLERET


Astuces et News : .Net, BizTalk, Team System, SQL ...

Actualités

  • BizTalk User Group


    Microsoft Most Valuable Professional

    Microsoft Certified Technology Specialist

    Microsoft Certified Solution Developer


    Exakis

    Windows Live Alerts

    View Arnaud Cleret's profile on LinkedIn

Implémenter simplement un service Java (JAX-WS)

Bon, je vois déjà les remarques de certains concernant ce billet mais rassurer vous je ne me suis pas converti à Java ! Wink

En fait, l'objectif est plutôt de communiquer une manière simple d'implémenter un Web Service basé sur JAX-WS à des fins de démos ou prototypes d'interopérabilité sans avoir à sortir une artillerie lourde du type serveur d'application, environnement de développement...

D'ailleurs, un grand merci à Stève Sfartz qui a pu nous transmettre cette approche lors des TechDays 2008. Big Smile

Seul pré-requis à cette approche : l'installation du JDK que vous pouvez télécharger ici.
Une fois installé, il est juste nécessaire de créer les trois fichiers suivants :

  1. Fichier d'implémentation du service : DemoService.java
  2. Fichier de script de compilation du service : Compile.bat
  3. Fichier de script de lancement et d'hébergement du service : Run.bat

Dans l'exemple suivant, le service exposera une méthode Notify prenant un paramètre d'entrée correspondant au message à afficher dans la console.

Dans le fichier DemoService.java, correspondant à l'impémentation de ce service, il suffit d'ajouter le code ci-après qui vous l'avouerez reste très proche d'une implémentation .Net C#. Deux méthodes sont à distinguer :

  1. la méthode Notify qui correspond à l'opération exposée par le service et affiche sur la console le message transmis.
  2. la méthode Main qui correspond au point d'entrée du programme et permet de publier le endpoint du service.

package Service;

import javax.jws.*;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.Endpoint;

@WebService(targetNamespace = "http://services.demo.fr/JAX-WS",
            name="AlertDispatcher",
            serviceName="DemoService")
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
             use=SOAPBinding.Use.LITERAL)
public class DemoService
{
   @WebMethod(operationName="Notify", action="urn:Notify")
   public void Notify(@WebParam(name="message") String a)
   {
      System.out.println("Message : " + a);
   }

   @WebMethod(exclude=true)
   public static void main(String[] args)
   {
      String endpointUri = "
http://localhost:8585/";
      Endpoint.publish(endpointUri, new DemoService ());
      System.out.println("Publishing JAX-WS at " + endpointUri);
   }
}

Une fois l'implémentation du service terminée, il est nécessaire de compiler la solution avant de l'exécuter.
Dans le fichier Compile.bat, correspondant au script de compilation, il suffit d'ajouter le code suivant :

set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_04\"
set PATH=%ATH%;%JAVA_HOME%\bin

javac *.java

move *.class Service

wsgen -cp . Service.DemoService

pause

Seul paramètre à modifier si besoin est le nom de la classe d'implémentation du service. Dans ce cas précis : DemoService.

Une fois la compilation effectuée, il ne reste plus qu'a exécuter le service en le hostant en mode console.
Dans le fichier Run.bat, correspondant au script de lancement et d'hébergement du service, il suffit d'ajouter le code suivant :

set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_04\"
set PATH=%ATH%;%JAVA_HOME%\bin

java Service.DemoService

pause

Comme précédemment, le seul paramètre à modifier si besoin le nom de la classe d'implémentation du service. Dans ce cas précis : DemoService.

Le service est donc maintenant hosté et prêt à être consommé :

Le contrat WSDL correspondant au service est disponible, dans notre cas, à l'adresse suivante : http://localhost:8585/DemoService?wsdl

La définition des données attendues par l'opération Notify est faite dans le schéma XSD se trouvant à l'adresse suivante : http://localhost:8585/DemoService?xsd=1

Il est donc désormais possible de consommer se service depuis une application Java mais aussi .Net avec deux approches différentes basées soit sur un client de type Web Service soit un client de type WCF en basicHttpBinding.
Pour ce faire, au travers de Visual Studio, il suffit de faire un Add Service Reference :

Une fois le service ajouté, la classe proxy et le fichier de configuration WCF générés, il est maintenant possible d'invoquer le service en quelques lignes de code :

AlertDispatcherClient client = new AlertDispatcherClient();
client.Notify("Interop JAX-WS / WCF is good !");
client.Close();

Au niveau de la configuration WCF et notamment du endpoint client, le constat est que la communication entre le service et le client sera de type basicHttpBinding sans autre élément particulier ou spécifique :

<?xml version="1.0" encoding="utf-8" ?>
<
configuration
>
  <
system.serviceModel
>
    <
client
>
      <
endpoint
        name="AlertDispatcherPort
"
       
address="http://localhost:8585/DemoService" 
       
binding="basicHttpBinding
"
        contract="DemoService.AlertDispatcher"
/>
    </
client
>
  </
system.serviceModel
>
</
configuration>

Il est donc maintenant possible d'exécuter le client et de constater qu'un message s'affiche bien sur la console du service JAX-WS :

Voilà, l'implémentation du serveur comme du client est terminée !

Le constat de cet exemple est qu'il est maintenant simplissime de monter un scénario d'interopérabilité entre .Net et Java sans pour autant faire appel à une artillerie lourde !

L'exemple de code exposé dans ce post est disponible aussi en téléchargement via le fichier zip attaché : télécharger.

Enjoy ! Wink

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 1 avril 2008 11:30 par arno
Classé sous : ,

Attachment(s): JAX-WS.zip

Commentaires

cyril a dit :

J'ai déjà tenté de faire de l'interop entre WCF et java, avec .net côté serveur.

J'ai tenté en vain d'utiliser le wsHttpBinding de WCF, j'ai du me resigner à utiliser le basicHttpBinding.

D'après ce que j'avais lu, Java serait capable d'utiliser du wsHttpBinding, t'as des informations là dessus ?

# avril 1, 2008 12:34

arno a dit :

En effet, la solution présentée ici n'interopère qu'avec un binding WCF de type basicHttp.

Pour des scénarii avancés via wsHttp, il faut pour cela que le service java qui est en face expose un contrat basé sur les normes WS-*.

Tu peux voir un webcast des TechDays sur ce sujet animé par Stéphane Goudeau et Alexis Moussine-Pouchkine : http://www.microsoft.com/france/vision/mstechdays08/WebcastMSDN.aspx?EID=54f1625a-7b5d-4b1d-9689-c491c9a728c5

# avril 1, 2008 12:56
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- SQL Server 2008 : Un livre en cours de préparation ! par SQL Server vu par Christian Robert le il y a 2 heures et 33 minutes

- IIS7 : à quel pool d'application correspond le processus w3wp.exe par Atteint de JavaScriptite Aiguë [Cyril Durand] le il y a 3 heures et 30 minutes

- PDC 2008 - J-14 ! par Nix's Blog le il y a 5 heures et 15 minutes

- [Silverlight] La version finale de Silverlight 2 sera disponible en téléchargement demain ! par Thomas Lebrun le il y a 7 heures et 8 minutes

- SharePoint 2007 : Professional Developers Conference 2008 par Philippe Sentenac [MVP SharePoint] le il y a 13 heures et 1 minutes

- [Silverlight] En attendant Silverlight 2 RTW par Blog Technique d'Audrey PETIT le 10-11-2008, 21:55

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le 10-11-2008, 01:18

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le 10-10-2008, 17:52

- Hello CS par Le Blog de julz le 10-10-2008, 12:26

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35