Voici le problème P>
Un utilisateur d'une application Web d'entreprise effectue une tâche qui entraîne une longue requête (ou une autre tâche intense de traitement longue) p>
Problèmes: P>
Il y a plusieurs solutions que j'ai proposées, mais je ne suis pas sûr que je sache, ce qui est meilleur (dans tous les aspects, la performance, la meilleure pratique, l'élégance et la maintenabilité) et j'aimerais savoir quelle est votre solution recommandée et S'il y a une solution que j'ai manquée? (probablement oui, et beaucoup) p>
Que feriez-vous / faisiez-vous dans vos projets? Quelles autres solutions vous connaissez? Lequel de ceux que j'ai notés ci-dessus est le gagnant de votre avis? p>
4 Réponses :
La solution que j'ai utilisée avant implique Jetty Cometd au lieu d'Ajax. La principale différence entre Ajax et Cometd est que Cometd peut utiliser davantage d'un pub / sous-modèle - le client (navigateur Web dans ce cas) Subsribe à l'éditeur (votre application) et de l'application pousse les mises à jour et les notifications au navigateur Web comme Apposé à un modèle Ajax d'interrogation constante du serveur par le navigateur Web. Vous pouvez utiliser la solution Cometd même si vous n'utilisez pas de jetée - vous pouvez déposer les pots de jetty dans le dossier LIB de votre serveur Web respectif et que vous devriez être prêt à partir. P>
Combien de temps fonctionne ces requêtes? P>
Si vous parlez de sessions expirant, il est peut-être préférable que l'utilisateur ne soit pas attendu pour cela. Il sera toujours gênant que l'utilisateur attendra 20 minutes de pointe de temps en temps dans cette onglet de la requête. p>
Donc, si des requêtes vraiment longues sont le cas, il est peut-être préférable de changer l'approche d'interface utilisateur et d'avoir l'utilisateur "commander" une requête qu'il revient plus tard à la vue ou est même notifiée par courrier . p>
Dans un tel cas, je disposerais de la requête préparée dans la DB et la mise en cache, dans une table séparée, là-bas. Signification, je aurai que le serveur Web fonctionne une fois pour enregistrer la demande, disposer d'une tâche DB ou d'un processus / serveur distinct préparez des requêtes sur les demandes et informez-en l'utilisateur, puis auquel le serveur Web l'affiche lorsque l'utilisateur revient pour le Résultats. P>
Ceci est couvert par toutes les solutions suggérées, il y aura évidemment un processus de serveur en arrière-plan et une notification à l'utilisateur. La question est la question de la technologie spécifique (la technologie Java à être aussi cuite) est la meilleure pratique à utiliser
@Ehrann: Je suggère que la notification soit "hors ligne" si c'est un très long temps d'attente, et je suggère que cela soit fait dans un travail de DB.
Je ferais une combinaison de votre "mauvaise solution" et de la "solution J2EE": p>
L'astuce consiste à faire correspondre la paire de demandes / de réponse. Je le ferais comme ceci: p>
null code> comme valeur. Également passer cet identifiant à l'interface utilisateur. LI>
- Laissez le thread de l'UI sondre l'AMS avec l'identifiant précédemment généré aussi longtemps que la valeur de la carte est
null code> em>. li>.
- Lorsque le résultat est prêt, laissez votre récepteur JMS dans la carte AMS à l'ID donné. LI>
- La prochaine fois que le fil de l'interface utilisateur interroge la carte, il recevra la réponse et arrêtera le sondage. Li>
ol>
Ceci est propre et bien résumé de tout domaine concret fort>. Une solution purement technique. p>
Même si vous n'aimez pas le sondage, HTTP est apatride à la conception et je pense que ce sondage ne se produit que sur des intervalles bien définis. p>
Quoi qu'il en soit, j'ai mis en place un système avec exactement ce modèle et il fonctionne simplement bien ... P>
Affiche un message à l'utilisateur qui "Votre demande est acceptée et prendra une heure pour être mise à jour" p>
Vous créez une table qui stocke toutes ces transactions et les processus dans un lot sur le serveur. P>
L'utilisateur n'aurait pas à attendre longtemps et il sera heureux de voir le message. Vous pouvez envoyer un email de confirmation une fois que votre transaction est traitée. P>
C'est la meilleure solution que je pense. p>