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

Flex Discussion :

Appels RPC RemoteObject en parallèle?


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Appels RPC RemoteObject en parallèle?
    Salut,

    Les RemoteObjects semblent bien limités dans Flex : on ne peut pas toujours les appeler en parallèle.

    J'ai fait un petit exemple minimal qui permet de mettre en évidence les problèmes.

    J'ai une classe java, qui sera le service appelé à distance. La méthode attend un certain temps (8 secondes ici) pour bien avoir le temps de se rendre compte du problème :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Service {
     
        public void method(int n) {
            System.out.println("method(" + n + ") starts");
            try {
                Thread.sleep(8000);
            } catch(InterruptedException e) {}
            System.out.println("method(" + n + ") ends");
        }
     
    }

    Dans remoting-config, je déclare ce service :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        <destination id="service">
            <properties>
                <source>Service</source>
            </properties>
        </destination>

    Et voici mon application MXML :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    	<mx:RemoteObject id="service1" destination="service" />
    	<mx:RemoteObject id="service2" destination="service" />
    	<mx:Button label="service1" click="{service1.method(1)}" />
    	<mx:Button label="service2" click="{service2.method(2)}" />
    	<mx:Button label="service1 AND service2" click="{service1.method(1);service2.method(2)}" />
    </mx:Application>

    Problème 1
    Il est impossible d'appeler une méthode d'un même RemoteObject (par exemple service1) plusieurs fois en parallèle.
    Pour vous en rendre compte, lancez l'application et cliquez plusieurs fois sur le bouton service1, et regardez la console du serveur : le deuxième commence après la fin du premier, le troisième commence après la fin du deuxième, etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    method(1) starts
    method(1) ends
    method(1) starts
    method(1) ends
    method(1) starts
    method(1) ends
    EDIT: En fait c'est encore plus étrange que ça, la première fois on ne peut l'appeler qu'une fois, mais si on attend de recevoir le résultat, ensuite on peut faire jusqu'à 6 appels en parallèle... Mais si on appelle les 6 la première fois, ils seront tous séquentiels...

    Workaround pour le problème 1
    Pour éviter le problème, il suffit de faire 2 RemoteObjects : service1 et service2. Et là ça fonctionne : appuyez sur le bouton service1 puis sur le bouton service2, ils sont bien exécutés en parallèle sur le serveur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    method(1) starts
    method(2) starts
    method(1) ends
    method(2) ends
    Problème 2
    Mais ce workaround ne fonctionne que s'ils sont appelés sur des évènements différents.
    Essayez de cliquer une fois sur le bouton service1 AND service2 : les deux appels sont séquentiels.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    method(1) starts
    method(1) ends
    method(2) starts
    method(2) ends
    Comment éviter ces problèmes?

    Merci d'avance.

    ®om

  2. #2
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    J'ai trouvé un moyen de contourner le problème 2 (mais au final ça ne rend pas super facile l'utilisation des RemoteObjects) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	<mx:RemoteObject id="service1" destination="service" endpoint="/TestRemoteObject/messagebroker/amf?a=1" />
    	<mx:RemoteObject id="service2" destination="service" endpoint="/TestRemoteObject/messagebroker/amf?a=2" />
    (où TestRemoteObject est le nom du projet)

    http://weblogs.macromedia.com/pent/a...ing_in_pa.html

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Une autre astuce consiste à séparer les appels de quelques millisecondes (50 par exemple) :
    Code xml : 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
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="initApp()">
        <mx:Script>
            <![CDATA[
     
                private var callNumber:int = 1;
     
                private function initApp():void {
                    service.init();
                }
     
                private function callItNTimes(n:uint):void {
                	callIt();
                	for(var i:uint = 1; i < n; i++) {
                	    callItLater(50 * i);
                	}
                }
     
                private function callItLater(ms:uint):void {
                	var timer:Timer = new Timer(ms, 1);
                    timer.addEventListener(TimerEvent.TIMER, function():void {callIt()});
                    timer.start();
                }
     
                private function callIt():void {
                	trace('START');
                    service.pingMe(callNumber++);
                }
     
                private function result(data:Object):void {
                	trace('END');
                }
     
            ]]>
        </mx:Script>
     
        <mx:RemoteObject id="service" destination="ping" result="result(event)" />
     
        <mx:Button label="Service" click="callIt()" />
        <mx:Button label="n calls" click="callItNTimes(8)"/>
    </mx:Application>
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class Ping {
     
        public void pingMe(int n) {
            System.out.println("method(" + n + ") starts");
            try {
                Thread.sleep(6000);
            } catch (InterruptedException ex) {}
            System.out.println("method(" + n + ") ends");
        }
     
        public void init() {
            System.out.println("init...");
        }
     
    }

    L'appel à init() permet de faire au moins 1 appel rpc avant de faire le test, car il faut toujours avoir le résultat du premier appel avant de pouvoir en lancer plusieurs en parallèle (bug signalé dans le premier post).

Discussions similaires

  1. Appels RPC multiples en parallèle
    Par romaint2b dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 26/07/2011, 09h28
  2. Pb // appel RPC
    Par CcHhUu dans le forum GWT et Vaadin
    Réponses: 22
    Dernier message: 11/08/2009, 16h25
  3. Réponses: 6
    Dernier message: 09/06/2009, 10h09
  4. Réponses: 6
    Dernier message: 30/12/2008, 19h44
  5. comment faire un appel RPC dans Command
    Par groupe dans le forum GWT et Vaadin
    Réponses: 7
    Dernier message: 27/06/2008, 11h36

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