2009-08-14 15 views
2

J'utilise RequestBuilder en temps des demandes GWT qui prennent trop de temps:Annulation d'un appel GWT côté serveur

RequestBuilder requestBuilder = _service.getStatistics(callback); 
requestBuilder.setTimeoutMillis(5000); 
try { 
    requestBuilder.send(); 
} catch (RequestException e) { 
    GWT.getUncaughtExceptionHandler().onUncaughtException(e); 
} 

Yat-il un moyen d'aviser le service distant invoqué que l'appel a délai d'attente sur le client et qu'il devrait être annulé?

+0

Votre méthode d'interface async '_service' est-elle? Si oui, comment spécifiez-vous la méthode et l'URL du constructeur de requête? – maks

Répondre

5

Sauf si vous faites un autre appel pour indiquer au service distant que l'appel précédent a été annulé!

+0

Merci pour la réponse. J'espère toujours une autre solution :-) –

+0

Vous pourriez essayer de regarder ceci http://stackoverflow.com/questions/585599/whats-causing-my-java-net-socketexception-connection-reset et voir si n'importe quoi peut être utilisé sur le serveur - par exemple, si vous interceptez une sorte d'exception de réinitialisation de connexion. Ce serait assez hacky, et je ne voudrais pas reocmmend ce genre de chose. Si vous avez vraiment besoin de dire au serveur que l'appel prev a expiré, il ne serait pas trop mal de faire un autre appel - tant que c'est rapide et rapide. – Chii

+0

côté serveur, définissez un indicateur dirty à false lorsque la demande initiale est entrée. Ajoutez un temporisateur à cette classe côté serveur qui traite la demande. Si le délai est écoulé avant que la requête ne soit fournie, définissez l'indicateur dirty sur true et renvoyez cette information, ou faites une requête http séparée à partir de la minuterie de votre classe côté serveur. –

1

Cela dépend réellement. Si le serveur fait beaucoup de travail (et que vous n'êtes pas sur Google App Engine), vous pouvez conserver la demande et appeler request.cancel(). Cela mettra fin à la demande du navigateur, mais le serveur continuera à fonctionner.

En fonction du format des données que vous renvoyez, vous pouvez demander au serveur de vider périodiquement certaines données vides sur le client pendant que l'appel est en cours de traitement. Cela provoquera le vidage d'une exception IOException si le client a annulé la demande et la connexion HTTP est terminée. Vous pouvez ensuite intercepter cette requête et arrêter le traitement de la requête côté serveur.

+0

Merci pour la réponse, c'est utile. C'est ce que l'on appelle un long sondage si je ne me trompe pas. J'espère toujours quelque chose de plus simple. –

+0

Il s'agit d'une idée similaire à un événement de longue durée, mais le modèle fonctionne également bien pour mettre fin à de longs processus. Il peut y avoir d'autres choses que vous ne pouvez pas facilement arrêter - un appel à une procédure DB lente ne s'arrêtera pas à moins que vous ne fermiez réellement une connexion, plutôt que de simplement la renvoyer à un pool. Une astuce que j'ai déjà utilisée: Si vous avez une tonne de choses à accomplir dans un appel de service, faites tourner un exécuteur de pool de threads et faites chaque Nth Runnable (où N est la taille du pool de threads) au client. Cela vous permettra, donner ou prendre, assurez-vous que vous n'exécutez pas plus de 2N-1 tâches supplémentaires. – kebernet