2008-10-25 20 views

Répondre

1

GWT ne fournit pas une solution en une seule étape pour le traitement par lot de plusieurs RPC arbitraires. Cependant, gardez à l'esprit que la sérialisation automatique de GWT facilite l'écriture des versions en série et en lot de chacune de vos méthodes RPC. Par exemple, supposons que vous avez défini ce RPC:

FooResponse callFoo(FooRequest request); 

Il est aussi facile d'écrire une version « batch » du même RPC vous:

ArrayList<FooResponse> batchCallFoo(ArrayList<FooRequest> requests) { 
    ArrayList<FooResponse> responses = new ArrayList<FooResponse>(); 
    for (FooRequest request : requests) { 
    responses.add(callFoo(request)); 
    } 
} 
+0

Votre solution ne fonctionne pas parce que les RPCs dans GWT sont asynchronouse; ils reviennent immédiatement après l'appel; le gestionnaire AsyncCallback est responsable de la gestion de la valeur. –

+0

Sauf si son batchCallFoo est l'implémentation côté serveur, dans ce cas, cela fonctionnera, mais en tant qu'appel côté client, son implémentation par lots ne fait rien de la sorte - il appelle à plusieurs reprises callFoo, qui est l'antithèse des appels "batch" . –

1

Il est une bonne question, mais je ne pense qu'il y a une solution facile.

Je crois que vous devrez créer une méthode séparée qui regroupe vos méthodes pour réaliser le traitement par lots d'une manière similaire à DWR.

Autrement dit, si vous avez:

public int add(int x, int y); 
public int sub(int i, int j); 

Vous créerais une nouvelle méthode pour les combiner:

public Map<String, Integer> addAndSub(Map methodsAndArguments) { 
    // Call add and sub methods with it's arguments 
} 

Vous aurez toujours besoin de gérer la réponse entière de la même méthode de rappel bien sûr . Je me rends compte que ce n'est peut-être pas la solution la plus élégante, mais en raison de la façon dont fonctionne GWTs RPC, je pense que c'est la voie à suivre. Avec GWT, je pense que vous devriez généralement essayer d'écrire vos méthodes afin que le traitement par lots ne soit même pas un problème que vous devez considérer.

8

Ray Ryan de Google a fait une présentation sur Best Practices For Architecting Your GWT App, où il a parlé de l'utilisation d'un modèle de commande. Envoyer des commandes asynchrones qui passent par-dessus RPC est ce que vous voulez probablement. Une fois que vous envoyez des commandes au lieu des RPC, il est très facile de les charger.

Voir gwt-dispatch pour une bibliothèque qui implémente ce modèle pour vous. Je commence juste à l'utiliser, donc je ne sais pas si ça se passe automatiquement, mais c'est tout open source avec une licence permissive, donc vous pouvez le réparer si ce n'est pas le cas.

1

Vous pouvez également utiliser GWTEventService si votre application s'insère dans le domaine de la comète (côté serveur-push):

GWTEventService est un cadre de communication client-serveur basé sur les événements. Il utilise GWT-RPC et la technique Comet/server-push. Le côté client offre une API de haut niveau avec des possibilités d'enregistrer les écouteurs sur le serveur comme pour un composant graphique. Les événements peuvent être ajoutés à un contexte/domaine du côté serveur et les écouteurs du côté client sont informés des événements entrants. Le côté serveur est complètement indépendant de l'implémentation du client et est hautement configurable.

Parce que l'un des avantages offerts par ce modèle d'événement est:

Les événements sont regroupés pour réduire serveur appelle