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

Wildfly/JBoss Java Discussion :

Désactiver la gestion des transactions sous JBoss 7.1.1


Sujet :

Wildfly/JBoss Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut Désactiver la gestion des transactions sous JBoss 7.1.1
    Bonjour,

    Je voudrai utiliser jboss tout en utilisant JDBC (et en gérant complètement mes transactions à la main). J'ai comme point d'entrée un service rest qui fait entre 1 et n appel à des beans. Chaque méthode de ma classe rest est donc sur ce modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    //Préparation de la connection :
    Connection connection = this.maDataSource.getConnection(login, motDePasse);
    connection.setAutoCommit(false);
     
    try {
    //appel aux beans
    monbean1.monservice1(connection);
    monbean2.monservice2(connection);
    ...
    connection.commit();
    } catch (EJBTransactionRolledbackException e) {
       connection.rollback();
       throw e;
    } catch (MonTypeRuntimeException e) {
       connection.rollback();
       throw e;
    } catch (MonTypeMetierException e) {
       connection.rollback();
       throw e;
    } finally {
       connection.close();
    }
    Bref, ma première question est : Est il possible de faire en sorte de récupérer une MonTypeRuntimeException/MonTypeMetierException plutôt qu'une EJBTransactionRolledbackException (en bref, que je puisse récupérer mon exception telle que je l'ai lancée)

    Mon second souci qui en découle, quand je fait le rollback sur ma connection après avoir récupéré mon EJBTransactionRolledbackException, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/testWeb].[Resteasy]] (http-localhost-127.0.0.1-8080-2) "Servlet.service()" pour la servlet Resteasy a généré une exception: org.jboss.resteasy.spi.UnhandledException: java.sql.SQLException: Transaction cannot proceed STATUS_MARKED_ROLLBACK
    Si j'enlève le rollback, j'ai encore un souci.
    En fait mon service que je teste sert à l'inscription. J'ai volontairement placé dedans un "throw MonTypeRuntimeException" pour tester le rollback, mon service ressemble donc à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    this.checkUniciteProfil(profil, connection);
    //persistence en sql natif
    ..
     
    //lancement exception
    throw MonTypeRuntimeException("Exception de test")
    A la première exécution, j'ai bien mon exception de test qui est lancé.
    A la seconde exécution, j'ai une erreur me disant que mon pseudo n'est pas unique
    A la troisième exécution, je me retrouve à nouveau sur mon exception de test

    Bref, une fois sur deux, j'ai l'impression que ma transaction est "En cours d'annulation" et que les données enregistrées dedans sont prises en compte dans ma requête de contrôle d'unicité du pseudo !

    Par contre, si je lance une MonTypeRuntimeException/MonTypeMetierException directement dans le service Rest, je la récupère dans le catch correspondant, et le rollback fonctionne bien (je récupère à chaque fois mon exception de test)

    Donc voilà j'aimerai que JBoss me laisse gérer entièrement manuellement mes transactions !
    Après je débute un peu sur le sujet, peut être que je fait totalement fausse route, dans ce cas là je suis d'accord pour changer ma façon de faire !
    Ma seule contrainte est de pouvoir continuer à tout faire en SQL, mon modèle est relativement simple et ne justifie pas d'utiliser Hibernate ou autre...

    Merci, toute suggestion pourra m'être utile, ça fait un moment que je cherche sur ce problème, mais sans rien trouver de concret !


  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 141
    Points
    4 141
    Par défaut
    Tes beans ressemblent à quoi ?
    Ce sont des EJBs ?

  3. #3
    Membre éprouvé
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Points : 1 269
    Points
    1 269
    Par défaut
    Si tes composants sont des EJBs (ce qui semble probable vu l'exception), j'ai 3 questions supplémentaires :
    - sont-ils transactionnels ?
    - sont-ils sécurisés ?
    - sont-ils appelés à distance ?

    Pour l'aspect transactionnel, c'est visiblement oui, mais tu n'en veux pas. Pour l'appel distant, je suppose que c'est non puisque c'est REST qui sert à ça. Reste le coté sécurisé.
    Ce à quoi je veux venir, c'est qu'à mon avis, tu n'as pas besoin d'EJB ! Si tu veux des composants avec un bel acronyme et avec de l'injection, utilise CDI. Sinon des classes normales.

    Toutefois, si tu veux rester sur les EJB, essaie de passer en transaction manuelle en annotant ton EJB avec @TransactionManagement(TransactionManagementType.BEAN).
    Ou alors dans un environnement avec les transactions gérées par le conteneur, tu peux contrôler tes commits et rollbacks avec l'objet UserTransaction, mais pas celui de JDBC.

    Plein de pistes possibles, pour moi la plus simple, c'est pas d'EJB !

    PS : JBoss 7.1.1 est truffé de bugs, utilise plutôt la 7.1.3, qu'il faut compiler soi-même (http://blog.alexis-hassler.com/2012/...boss-as-7.html)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    Merci pour ces réponses, je en suis pas chez moi mais je peux déjà répondre partiellement :
    Oui, mes beans sont actuellement des EJB.

    - sont-ils transactionnels ?
    J'en ai peur, sinon il ne me ferait pas ce type d'exception si?
    - sont-ils sécurisés ?
    J'utilise la configuration par défaut de JBoss pour le moment, c'est un point sur lequel je ne me suis pas du tout penché encore
    - sont-ils appelés à distance ?
    Non, c'est appelé en local

    Je ne connais pas CDI, mais ça vaut peut être le coup que je m'y penche si je n'arrive pas à me dépatouiller avec mes beans (Je préfèrerai quand même rester sur les beans si je peux m'en sortir avec!). Quel est l'avantage de solutions comme CDI par rapport à un simple singleton?

    Concernant le @TransactionManagement(TransactionManagementType.BEAN), j'ai déjà fait le test sans succès.

    Je ferai également des tests avec l'objet UserTransaction pour voir si j'arrive à quelque chose de stable !

    Enfin voilà je vais faire ces quelques tests, je vous tiendrai informés !

    A plus !

  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 141
    Points
    4 141
    Par défaut
    A la vue de tes réponses, pourquoi utilises-tu des sessions beans, puisque tu ne te sers pas de la gestion des transactions, de la sécurité et de l'accès distant.
    Cela simplifierait les choses.

Discussions similaires

  1. gestion des transactions sous talend
    Par abdou.ham dans le forum Développement de jobs
    Réponses: 8
    Dernier message: 19/01/2013, 08h45
  2. gestion des transactions sous interbase et delphi
    Par ally dans le forum InterBase
    Réponses: 3
    Dernier message: 28/02/2007, 12h17
  3. Gestion des .log sous Oracle
    Par SANOORA dans le forum Administration
    Réponses: 10
    Dernier message: 08/11/2004, 09h29
  4. gestion des transactions
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/03/2004, 21h53
  5. Routines de gestion des ports sous Windows XP
    Par wiccanhelios dans le forum Windows
    Réponses: 2
    Dernier message: 14/11/2003, 08h02

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