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:
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:
1 2 3 4 5
| <destination id="service">
<properties>
<source>Service</source>
</properties>
</destination> |
Et voici mon application MXML :
Code:
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:
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:
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:
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