IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Comment gérer les traitements "longs" (génération de rapport)


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut Comment gérer les traitements "longs" (génération de rapport)
    Bonjour,

    Je développe une application javaee pour ma société qui doit permettre entre autre de générer des rapports (PDF) et autre analyses qui peuvent parfois prendre un peu de temps (pas une demi heure mais en tout cas quelques secondes).

    Etant débutant en javaee, je me pose la question de comment bien gérer cela.

    Comme l'application sera multi-utilisateur, lorsqu'un utilisateur demande la génération d'un rapport, le serveur fait le boulot, mais du coup il est indisponible pour un autre utilisateur qui voudrait faire autre chose, c'est bien juste ?

    Dans ce cas, comment faire pour optimiser cela et faire en sorte que l'application soit utilisable de manière agréable ?

    Merci d'avance pour vos conseils

  2. #2
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par doons Voir le message
    Comme l'application sera multi-utilisateur, lorsqu'un utilisateur demande la génération d'un rapport, le serveur fait le boulot, mais du coup il est indisponible pour un autre utilisateur qui voudrait faire autre chose, c'est bien juste ?
    Ca dépend comment tu implémentes ta solution.
    Si tu le fais "normalement" sans te poser de question, chaque personne qui demandera un rapport provoquera la génération du dit rapport. Si tu le fais de manière synchronisée, chaque utilisateur devra attendre (je déconseille cette approche)


    Pour optimiser, ben ça dépend de plein de paramètres, mais il y en a un qui est toujours vrai : est-ce que tu peux "préparer" en amont les rapports plutôt que de les générer à la volée? Est-ce toujours les mêmes pour les utilisateurs ou est-ce qu'ils peuvent préciser des paramètres?
    Si les rapports sont toujours les mêmes, tu peux les pré-charger en amont dans un système qui les mettrait à disposition de tout le monde.

    Si tu ne peux pas les pré-charger et que ça prend du temps, tu peux partir sur plusieurs solutions :
    - le rapport est envoyé par mail une fois qu'il est généré : ça permet de ne pas bloquer l'utilisateur sur la page où il demande son rapport
    - tu mets en place un système asynchrone de ton choix (ajax, websockets...) qui préviendra l'utilisateur lors de la fin de la génération de son rapport et qui lui permettra de le récupérer
    - tu mets en place un système qui avertisse l'utilisateur que la génération de son rapport est terminée et qu'il peut le récupérer à un endroit précis dans ton application (du genre une page de résultat de génération de rapports)


    Bref, si ça prends du temps, la solution est de passer par une solution asynchrone qui permet de ne pas laisser l'utilisateur attendre que son rapport soit généré

  3. #3
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Merci pour ta réponse.

    Alors les rapports je ne pourrai pas les générer à l'avance, ils dépendent de sélection de l'utilisateur.
    Je trouve l'idée de l'email pas mal...

    tu mets en place un système asynchrone de ton choix (ajax, websockets...) qui préviendra l'utilisateur lors de la fin de la génération de son rapport et qui lui permettra de le récupérer
    Est-ce que tu peux juste préciser un petit peu comment faire cela, ce n'est pas très clair pour moi.
    Et qu'en est-il des autres utilisateurs ? C'est justement le fait de faire le traitement en asynchrone qui ne va as bloquer les autres utilisateurs, c'est bien ça ?

    Encore merci pour ton aide

  4. #4
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Non, pas de blocage à moins que tu ne provoques ce blocage en codant de façon à le provoquer (ce qui je le répète est une très mauvaise idée)

    En gros, tu as un bouton sur ta page qui provoque un appel vers ton serveur qui ne renverra rien dans l'immédiat. Sur le serveur, à réception de cet appel, tu lances le traitement qui permettra de générer le rapport, et une fois terminé, tu notifies l'utilisateur (avec par exemple un système qui vérifie à chaque page si une notification existe pour l'utilisateur et qui l'affiche si c'est vrai)

    Attention de bien faire en sorte de bloquer les doubles clics sinon tu risques de faire saturer ton serveur :p

  5. #5
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    D'accord, très bien.

    Sur le serveur, à réception de cet appel, tu lances le traitement qui permettra de générer le rapport
    Ce traitement ne doit pas être fait dans un thread ? Ou c'est le serveur d'application qui gère cela ?
    Car comme j'ai l'impression que ça fonctionne, je me dis que le serveur ne peut faire qu'une chose à la fois, et pour le reste il faut attendre, y compris pour les autres utilisateurs si il n'y a pas une gestion de threads derrière

    Je me rends compte qu'il faudrait que je me documente un peu sur le fonctionnement de la partie serveur d'une application web

  6. #6
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par doons Voir le message
    Je me rends compte qu'il faudrait que je me documente un peu sur le fonctionnement de la partie serveur d'une application web
    Oui :p

    Chaque utilisateur possède déjà son propre thread en fait. C'est géré directement par le serveur avec les sessions.


    Par contre, pour ce qui est du lancement du traitement en tâche de fond, il vaut mieux effectivement confier son exécution à un Thread, ou mieux, à un pool de threads qui pourra traiter au fur et à mesure les différentes demandes avec une jolie file d'attente (ce qui permettra aussi d'éviter une saturation de ton serveur avec trop de threads lancés en même temps)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/07/2005, 09h29
  2. Réponses: 2
    Dernier message: 08/07/2005, 10h40
  3. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  4. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo