2010-10-15 2 views
4

une question simple et théorique, la réponse est probablement une, mais je voudrais écouter quelques opinions et suggestions. Je suis dans le besoin de réaliser un service web (en Java) qui va lancer un processus de longue haleine, qui va analyser un fichier d'entrée et faire du dôme personnel db.comment construire un service web chronophage

Quelle est la meilleure approche pour faire savoir à l'utilisateur que tout le processus a non seulement commencé, mais a pris fin, avec l'analyse, la mise à jour db ...? Parce que je ne peux pas suspendre l'utilisateur en attendant que tout le processus se termine.

Remarque: l'utilisateur est authentifié avant de démarrer le processus.

EDIT: le service Web est accessible non seulement via un navigateur Web, mais les clients peuvent y accéder avec n'importe quel client construit avec la langue qu'ils désirent, à condition qu'ils se réfèrent au wsdl.

grâce

+1

envoyez-leur un e-mail quand c'est fait – Thilo

+0

Vous avez mentionné que vous ne pouvez pas suspendre l'attente d'un utilisateur, alors pouvons-nous supposer que vous utilisez un thread séparé pour analyser, db stuff, etc? –

+0

au moment où le service Web est en cours de conception. Aucun code n'a été écrit. Donc, toute suggestion est la bienvenue. Ce que je ne veux pas, c'est laisser l'utilisateur attendre que la fenêtre du navigateur soit ouverte jusqu'à ce que le service web soit terminé. – Leonardo

Répondre

6

Pour votre scénario, vous devez implémenter des services Web asynchrones. Avec les services Web asynchrones, vous avez deux options.

  1. (comme quelqu'un l'a déjà mentionné) que vous pouvez faire polling du service pour voir si le processus est fait
  2. Vous pouvez demander au serveur de rappel automatique

La première approche est facile à mettre en œuvre et cela fonctionnerait avec de nombreuses bibliothèques WS. Cependant, ceci a un inconvénient: votre serveur doit gaspiller de la bande passante pour les demandes d'interrogation du client. Après tout, c'est l'interrogation. et la plupart du temps, le sondage est une mauvaise idée. Ce dernier ne serait pas aussi simple que le premier à mettre en œuvre. Et vous, je ne sais pas si chaque bibliothèque JAX-WS le supporterait. Pour vous soutenir, j'ai fait une recherche google rapide et trouvé ce lien.

http://www.developer.com/java/web/article.php/3863416/Using-Axis2-and-Java-for-Asynchronous-Web-Service-Invocation-on-the-Client-Side.htm

Cela pourrait vous aider un peu.

+0

+1 pour mentionner le rappel. Je recommanderais certainement une conception de rappel plutôt que d'interroger. Cela ne fonctionne bien sûr que lorsque le client est * capable * d'écouter un rappel, par exemple si le client est une application web. Si vous implémentez le rappel, le client doit inclure des détails de rappel, tels qu'une URL. – Qwerky

4

je voudrais donner à l'utilisateur un jeton lorsqu'ils soumettent les données et les ont sondage (de façon asynchrone) à une autre méthode avec leur jeton. Ensuite, dans la première méthode, j'ajouterais les données à une file d'attente et j'aurais un autre processus en cours d'exécution sur le serveur pour vérifier cette file et effectuer le traitement. Ensuite, mettez à jour le jeton dans la base de données pour informer l'utilisateur que son travail est terminé. J'ai travaillé sur des choses comme ça auparavant et trouvé que déclencher un processus de longue durée sur un système basé sur HTTP/web est une mauvaise idée car les systèmes sous-jacents peuvent souvent temporiser les appels à la webservice qui sont de longue durée.

+0

+1; pourquoi parlez-vous de "tentation"? Quel est le côté sombre de cette approche? – chiccodoro

+0

@chiccodoro Figure de la parole, mais vous avez raison. C'est la seule façon de le faire! –

+0

Le dernier mois, j'ai fait exactement ce truc. +1 –

Questions connexes