Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 11 sur 11
  1. #1
    Membre chevronné
    Avatar de ZouBi
    Inscrit en
    octobre 2007
    Messages
    505
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : octobre 2007
    Messages : 505
    Points : 699
    Points
    699

    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
    Modérateur

    Inscrit en
    août 2006
    Messages
    3 075
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 075
    Points : 3 353
    Points
    3 353

    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 chevronné
    Avatar de ZouBi
    Inscrit en
    octobre 2007
    Messages
    505
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : octobre 2007
    Messages : 505
    Points : 699
    Points
    699

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 754
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 754
    Points : 11 827
    Points
    11 827

    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
    Modérateur

    Inscrit en
    août 2006
    Messages
    3 075
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 075
    Points : 3 353
    Points
    3 353

    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
    Modérateur
    Avatar de sinok
    Profil pro
    Inscrit en
    août 2004
    Messages
    8 754
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2004
    Messages : 8 754
    Points : 11 827
    Points
    11 827

    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
    Modérateur

    Inscrit en
    août 2006
    Messages
    3 075
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 075
    Points : 3 353
    Points
    3 353

    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 Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 191
    Points : 34 861
    Points
    34 861

    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
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

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

    Informations forums :
    Inscription : octobre 2007
    Messages : 505
    Points : 699
    Points
    699

    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 chevronné
    Avatar de ZouBi
    Inscrit en
    octobre 2007
    Messages
    505
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : octobre 2007
    Messages : 505
    Points : 699
    Points
    699

    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 éclairé
    Homme Profil pro Sébastien Desbois
    Ingénieur développement logiciels
    Inscrit en
    février 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Nom : Homme Sébastien Desbois
    Âge : 31
    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 : 231
    Points : 349
    Points
    349

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •