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 :

Traitement asynchrone dans une application serveur


Sujet :

Développement Web en Java

  1. #1
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut Traitement asynchrone dans une application serveur
    Bonjour,
    Aujourd'hui je me retrouve face à un problème. Dans une application serveur en JEE tournant actuellement sous Glassfish ; je vais devoir exécuter des traitements qui pourront durer aux alentours de 5 minutes.
    Ainsi, il va falloir que je trouve une solutio car je ne peux pas laisser le client attendre que sa page se charge après 5 secondes... De toute manière, une page d'erreur time out s'affichera bien avant.
    Ainsi, comment puis-je t-il procéder?
    Merci d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    - utiliser un nouveau thread à partir de ta servlet
    - utiliser un ejb session bean asynchrone (il te faut un container compatible ejb 3.1)

  3. #3
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Bonjour et merci.
    Concernant l'ouverture d'un Thread dans un servlet? N'est-ce pas dangereux?
    Ce thread, après un traitement long exécuté par une fonction JNI, devra à la fin mettre à jour un champ dans une base de donnée (pour indiquer le résultat du traitement).
    J'utilise les datasources de Glassfish pour faire mes connexion à la base de données. Se servir de cette datasource en dehors du thread principale ne cause pas de soucis?

    Concernant le second choix, j'ai vu sur le net que J2EE 3 implémentait les taches asynchrones, mais je n'ai pu réussir à trouver de tutoriels sur le net. Aurais-tu une piste?

    Je suis aussi tombé sur l'idée du JMS mais ça me parait trop bien compliquer à mettre en tache pour simplement une seule tache qui se fera en asynchrone.

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu parles d'EJB 3 plutôt que JavaEE 3 j'imagine

    http://javahowto.blogspot.fr/2010/03...in-ejb-31.html
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Il n'y a, à priori pas de risque à utiliser un thread à part, pas plus que ton datasource, à partir du moment ou tu traites biens les ouvertures, fermetures de connexions et tes exceptions.

    JMS n'est pas si compliqué que cela, mais effectivement un peu plus que les deux autres solutions.

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Il n'y a, à priori pas de risque à utiliser un thread à part, pas plus que ton datasource, à partir du moment ou tu traites biens les ouvertures, fermetures de connexions et tes exceptions.
    Tout va dépendre de ton serveur d'application et de sa gestion des contexte. Par exemple Websphere, suivant la façon dont tu essaies de récupérer une ressource JNDI depuis le contexte te donnera accès (ou pas) à cette ressource si tu te trouves dans un Thread labellisé JavaEE (donc émis par websphere) ou un thread normal.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Je ne connaissais pas ce genre de limitation.
    Dans ce cas, si possible, il vaut mieux passer par un ejb asynchrone, ce qui éviterait le problème que tu cites.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je rajoute que, si tu as récupéré la datasource dans un thread, il n'est souvent pas possible de l'utiliser dans un autre. Certains conteneurs peuvent, par exemple, systématiquement cloturer toutes les connexion demandées par un thread http en fin de requete http. C'est le cas de jboss qui, au passage, te gratifie d'un gros message dans les logs te faisant comprendre que le programmeur est un gros cochon

  9. #9
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Bonjour et merci à tous pour vos réponses.
    Pour un début, j'utilise un thread internet au container. Ca a l'air de bien marcher pour le moment mais les tests effectués jusqu'ici ne sont qu'en local et avec un seul utilisateur.
    On verra bien si cela posera probleme par la suite dans quel cas je penserai passer par JMS.

  10. #10
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Finalement, je vais passer sur des ejb car mon application deviendra distribué dans l'avenir donc autant commencer maintenant.
    Jusqu'ici, je faisais tous les appels à la Database dans les servlets. Mais je vois partout qu'il faut mieux les faire dans des EJBs. Pourquoi?
    Je commence tout juste à me mettre dans le distribué, ainsi je ne connais pas encore tous les réfléxes à avoir et leur raison d'etre.

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    tu as besoin de traitement longs, et tu écris que tu exploites JNI.

    Les traitements longs sont généralement traités dans un EJB MDB, activé par message JMS sur une Queue.

    JNI, par contre, implique un chargement de librairie native. On tombe alors en dehors des contraintes de sécurité autorisables ( en fonction de la configuration de ton serveur d'application ) pour les composants managés.

    Je pense qu'une solution adaptée est de développer un petit connecteur JCA.

    Cordialement,
    S. Desbois

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/06/2014, 23h01
  2. Traitement asynchrone dans une methode void
    Par topolino dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/05/2013, 00h10
  3. Traitement asynchrone dans une servlet ?
    Par aurelientp dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 20/05/2011, 18h29
  4. Réponses: 4
    Dernier message: 04/12/2008, 21h46
  5. Réponses: 2
    Dernier message: 12/10/2004, 14h04

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