IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Différence entre stub et proxy


Sujet :

Services Web Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut Différence entre stub et proxy
    Bonjour à tous,

    Je suis en train d'étudier l'implémentation de services web JavaEE et je me pose une question (enfin pas qu'une, mais déjà celle-ci) :

    Lorsque je veux créer un client pour consommer un service web existant (grâce à son WSDL), j'ai le choix d'utiliser un stub ou bien un proxy pour récupérer les méthodes proposées par le service web.
    Par exemple, pour un service CurrencyConvertor que j'utilise en indiquant à Eclipse la localisation du WSDL du service, Eclipse m'a entre autres généré deux classes CurrencyConvertorSoapStub et CurrencyConvertorSoapProxy

    Toutefois, lorsque je veux lancer mon client en utilisant le stub, je dois lui spécifier deux paramètres (java.net.URL endpointURL et javax.xml.rpc.Service service) que je ne connais pas, tandis que le proxy fonctionne sans rien spécifier.

    Ainsi, je me demande quelle est la différence entre le stub et le proxy générés ?

    Merci de vos réponses !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Points : 111
    Points
    111
    Par défaut
    En fait selon les contextes cela peut vouloir de choses pareilles ou différentes. Mais pour des systèmes répartis on peut voir cela comme suit :

    Un Stub : c'est en général un objet qu'on a en local mais qui ne contient
    aucun code. En fait il contient des descriptions de services que tu peux appeller. Il represente une copie d'un objet donc, mais qui est distant. Et le stub s'occupe d'appeller le veritable objet qui est distant. En java par exemlpe, notamment en RMI, le stub est une interface qui étend remote et qui dont les méthodes sont appelés par le client. Puis RMI se charge d'appeller l'objet implémentant les méthodes l'interface lui méme. Cela garantit la transparence.

    Un proxy : en général est une application qui se situe entre unclient et le server, il peut faire office de server pour le client, puis invoque lui meme le server. Mais comme tu peux le voir ça ressemble au stub. D'ailleurs avec les applications distribuées, ils se confondent allegrement. Essaie de lire les tutos de sun : http://java.sun.com/developer/techni.../J2EE/j2ee_ws/.

    Mais en lisant ta question : pour le stub il faut lui spécifier l'url du service distant à appeller puis le service que tu souhaite invoquer. Je me demande si t'as pas inverser proxy et stub. Car le stub est censé appeller directement sans paramètres l'objet distant qu'il appelle, vu qu'il représente ses services en local.

  3. #3
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Merci de ta réponse !

    Effectivement, on confond souvent stub et proxy ou alors on parle de stub comme proxy côté client par opposition au skeleton comme proxy côté serveur.
    Sun semble placer le stub comme objet statique et le proxy comme objet dynamique.
    Je conçois en effet que le stub ne devrait donc pas avoir besoin de paramètres, mais dans le cas de ce service CurrencyConvertor c'est pourtant bien le proxy que l'on peut utiliser sans paramètres et le stub qui demande l'URL et le nom du service, alors il y a peut-être une confusion de terminologie du côté d'Eclipse ou bien d'Axis dans la génération du code client...

  4. #4
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Voici une définition du stub que j'ai trouvée sur le guide utilisateur d'Axis à l'adresse http://ws.apache.org/axis/java/user-...rvicesWithAxis :
    A Stub class implements the SDI [Service Definition Interface]. Its name is the binding name with the suffix "Stub". It contains the code which turns the method invocations into SOAP calls using the Axis Service and Call objects. It stands in as a proxy (another term for the same idea) for the remote service, letting you call it exactly as if it were a local object. In other words, you don't need to deal with the endpoint URL, namespace, or parameter arrays which are involved in dynamic invocation via the Service and Call objects. The stub hides all that work for you.
    Malheureusement, stub et proxy sont là encore confondus...

    Sinon, voici comment instancier stub ou proxy pour le service CurrencyConvertor (transposable pour tout autre service) :

    - stub méthode directe avec l'URL du service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try {
        URL endpoint = new URL("http://www.webservicex.com/CurrencyConvertor.asmx");
        CurrencyConvertorLocator service = new CurrencyConvertorLocator();
        CurrencyConvertorSoapStub stub = new CurrencyConvertorSoapStub(endpoint, service);
        double rate = stub.conversionRate(Currency.EUR, Currency.USD);
     
        System.out.println("1€ vaut " + rate + "$");
    } catch(MalformedURLException e) {
        e.printStackTrace();
    } catch(RemoteException e) {
        e.printStackTrace();
    }
    - stub méthode indirecte (la classe CurrencyConvertorLocator se charge de tout) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try {
        CurrencyConvertor service = new CurrencyConvertorLocator();
        CurrencyConvertorSoapStub stub = (CurrencyConvertorSoapStub)service.getCurrencyConvertorSoap();
        double rate = stub.conversionRate(Currency.EUR, Currency.USD);
     
        System.out.println("1€ vaut " + rate + "$");
    } catch(ServiceException e) {
        e.printStackTrace();
    } catch(RemoteException e) {
        e.printStackTrace();
    }
    - proxy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
        CurrencyConvertorSoapProxy proxy = new CurrencyConvertorSoapProxy();
        double rate = proxy.conversionRate(Currency.EUR, Currency.USD);
     
        System.out.println("1€ vaut " + rate + "$");
    } catch(RemoteException e) {
        e.printStackTrace();
    }

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 11h53
  2. [EJB] Différence entre un stubs et une interface ?
    Par Shogun dans le forum Java EE
    Réponses: 1
    Dernier message: 28/04/2007, 21h33
  3. Différence entre un stubs et une interface ?
    Par Shogun dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2007, 22h12
  4. Différence entre un Firewall et un Proxy.
    Par kabouns dans le forum Applications
    Réponses: 6
    Dernier message: 29/12/2005, 17h39
  5. Réponses: 3
    Dernier message: 07/05/2002, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo