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 :

Axis2 Asynchrone et timeout


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut Axis2 Asynchrone et timeout
    Bonjour,

    J'ai un webservice Axis2 en mode asynchrone, mais celui-ci semble tout de même "essayer" d'avoir une réponse du serveur pendant un certain temps.

    Si ce temps est dépassé j'ai une exception côté client type axisfault read time out, alors que:
    - mon traitement côté serveur se termine parfaitement et indépendamment du client
    - le client a les mains libres, la preuve en est qu'une fois le traitement appelé, je change de page jsp, et je vois dans ma console tomcat que le serveur continu le traitement en parallèle
    => autrement dit, j'ai un time out alors que mon traitement est bien appelé et traiter de manière aynchrone.

    Le problème que cela me pose est que du coup j'ai quand même une exception dans mes logs alors que au final tout se passe bien.

    Comment faire pour que si le traitement est lancé, le client n'utilise pas de timeout?

    Merci !

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Pour info, je pense avoir trouver la solution sur le net, mais je n'ai pas terminé de la mettre en place.

    Il semblerait qu'il existe plusieurs niveaux d'asynchronisme avec Axis2.
    Pour être totalement asynchrone, suivre les informations ici :
    http://www.ibm.com/developerworks/we...rary/ws-axis2/
    http://www.cs.tau.ac.il/courses/data...userguide.html
    http://www.cs.tau.ac.il/courses/data...s/1_3/dii.html

    En gros ces info indiquent que :
    -il faut engager le module axis2 addressing côté client (par une ligne de code avant d'appeler le webservice)
    -il faut engager le module axis2 addression côté serveur niveau global, par exemple via une modification du axis2.xml, ou dans l'interface admin d'axis2
    -il faut changer les class des receivers définies dans le services.xml par des classes de type asynchrone (exemple : <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCInOutAsyncMessageReceiver" />)

    côté code client ces mesures mênent à écrire quelque chose dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    stub._getServiceClient().getOptions().setUseSeparateListener(true);
    stub._getServiceClient().getOptions().setProperty("org.apache.axis2.addressing.AddressingConstants.WS_ADDRESSING_VERSION", org.apache.axis2.addressing.AddressingConstants.Final.WSA_NAMESPACE);
    stub._getServiceClient().engageModule("addressing");
    stub.ma_methode_business(object,un_callback)
    Je ne suis pas sur de l'utilité/fonctionnalité de la ligne stub._getServiceClient().getOptions().setProperty("org.apache.axis2.addressing.AddressingConstants.WS_ADDRESSING_VERSION", org.apache.axis2.addressing.AddressingConstants.Final.WSA_NAMESPACE);

    Pour engager côté client il faut mettre le addressing.mar à copier du serveur dans le classpath du client

    Si j'ai le temps lorsque j'aurais terminé, je reposterais pour présenter plus clairement et proprement la façon dont il faut s'y prendre.

  3. #3
    oca
    oca est déconnecté
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Par défaut
    Il y a aussi une autre solution je pense.
    Axis2 peut être utilisé au travers de la norme JAX-WS.
    La norme JAX-WS gère les appels asynchrones.
    A+

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Par défaut
    Citation Envoyé par oca Voir le message
    Il y a aussi une autre solution je pense.
    Axis2 peut être utilisé au travers de la norme JAX-WS.
    La norme JAX-WS gère les appels asynchrones.
    A+
    Aurais-tu un lien vers un tuto/doc?
    Personnellement je n'ai pas vraiment trouvé d'info sur le site Axis2, je m'y suis peut-être mal pris

    Merci !

  5. #5
    oca
    oca est déconnecté
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Par défaut
    oui, j'ai un exemple qq part... (j'avais utilisé metro comme implémentation mais cela devrait marcher aussi avec axis2) je vais poster mon exemple dès que je l'aurai retrouvé
    A+

  6. #6
    oca
    oca est déconnecté
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Par défaut
    J'ai retrouvé mon exemple asynchrone avec JAX-WS

    Il faut commencer par généré les classes "client" pour les web service (ou alors passer par un Dispatch mais c'est une autre histoire)

    Pour généré les classes client pour un web service disponible sur http://localhost:9083/hello?wsdl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wsimport -s D:\eclipse\Test\TestJaxWSClientAsynch\src -b D:\eclipse\Test\TestJaxWSClientAsynch\src\asynch\bindings.xml http://localhost:9083/hello?wsdl
    Voici le fichier bindings.xml que j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <bindings
        wsdlLocation="http://localhost:9083/hello?wsdl"
        xmlns="http://java.sun.com/xml/ns/jaxws">
    	<enableAsyncMapping>true</enableAsyncMapping>
    </bindings>
    Une fois les classes générée, mon "main" ressemble à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    package asynch;
     
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
     
    import javax.xml.namespace.QName;
    import javax.xml.ws.Response;
    import javax.xml.ws.Service;
     
    import oca.MonPortType; // le package oca est généré par wsimport
    import oca.SayHelloResponse; // le package oca est généré par wsimport
     
    public class ASynchClient {
     
    	public static void main(String args[]) throws Exception {
     
    		URL wsdlLocation = null;
    		try {
    			wsdlLocation = new URL("http://localhost:9083/hello?wsdl");
    		} catch (MalformedURLException e) {
    			e.printStackTrace();
    		}
    		QName serviceName = new QName("http://oca", "MonService");
    		Service s = Service.create(wsdlLocation, serviceName);
    		MonPortType port = s.getPort(MonPortType.class);
     
    		ExecutorService executor = Executors.newFixedThreadPool(5);
            s.setExecutor(executor);
     
            // par Polling 
            Response<SayHelloResponse> resp =  port.sayHelloAsync("Hi", "Oli");
            while(!resp.isDone()){
               System.out.println("waiting");
            } 
            SayHelloResponse sayRep = resp.get();
            System.out.println(sayRep.getReturn());
     
     
            // par Callback  
            port.sayHelloAsync("Hello","Oli",new MyAsyncHandler());
     
    		System.out.println("=====================================");
     
    		System.out.println("Completed");
    		System.exit(0);
    	}
     
    }
    Il faut encore ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package asynch;
    import java.util.concurrent.ExecutionException;
    import javax.xml.ws.AsyncHandler;
    import javax.xml.ws.Response;
    import oca.SayHelloResponse; // le package oca est généré par wsimport
     
    public class MyAsyncHandler implements AsyncHandler<SayHelloResponse>{
     
    	@Override
    	public void handleResponse(Response<SayHelloResponse> res){
    		try {
    			SayHelloResponse resp = res.get();
    			System.out.println("Event -> "+resp.getReturn());
     
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		} catch (ExecutionException e) {
    			e.printStackTrace();
    		}
    	}
    }

    A noter que le main test les deux méthodes disponibles dans JAX-WS pour un appel asynchrone , à savoir le callback et le polling.


    Voila, j'espère que cela peut t'aider
    A+

Discussions similaires

  1. [Axis2] Configuration du timeout pour un client
    Par Abalam dans le forum Services Web
    Réponses: 1
    Dernier message: 28/10/2009, 16h58
  2. Timeout des sockets asynchrones ?
    Par icareo dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 18/08/2009, 14h17
  3. BPEL, Axis2 et Web Service Asynchrone
    Par yannickr dans le forum Oracle
    Réponses: 0
    Dernier message: 20/07/2009, 09h51
  4. Asynchrone et timeout
    Par xian21 dans le forum C#
    Réponses: 4
    Dernier message: 08/12/2008, 14h27
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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