Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1310 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  problème EJB en remote

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème EJB en remote

n°1810153
lothar83fr
Posté le 09-11-2008 à 17:38:52  profilanswer
 

bonjour
voila je suis débutant en java et j'ai un petit soucis avec mes ejbs.
lorsqu'ils tournent sur la même machine (corbaname:iiop:localhost:3700... ) tout fonctionne.
Seulement quand je met mes ejbs metiers sur un serveur distant et que je tente d'y accéder :
 
Internal Exception: java.sql.SQLException: Erreur lors de l'établissement d'une connexion. Raison : java.lang.IllegalStateException: impossible d''ajouter une ressource non-XA à une transaction JTS globale.
Error Code: 0
Call: SQLCall(INSERT INTO utilisateur (prenom, etat, login, ip, pseudo, port, timeOut, nom, mdp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?))
Query: InsertObjectQuery(Ecml.Projet.metier.Utilisateur[idUtilisateur=null])
 
gestionUtilisateur:

Code :
  1. @Remote
  2. public interface gestionUtilisateurs {
  3.    
  4.     public int Inscription(String login,String mdp,String pseudo,String nom,String prenom);
  5. ...}


 
gestionUtilisateurBean:

Code :
  1. @Stateless
  2. public class gestionUtilisateursBeans implements gestionUtilisateurs {
  3.     @PersistenceContext
  4.     private EntityManager em;
  5.     private FileWriter logFile;
  6.     private DateFormat date;
  7.     private DateFormat heure;
  8.     public gestionUtilisateursBeans() {
  9.         logFile = null;
  10.         date = new SimpleDateFormat("dd-MM-yy-" );
  11.         heure = new SimpleDateFormat("hh:mm:ss: " );
  12.     }
  13.     public int Inscription(String login, String mdp, String pseudo, String nom, String prenom) {
  14.         Query result = em.createNamedQuery("Inscription" ).setParameter("login", login);
  15.         if (result.getResultList().isEmpty() == true) { //si le login n'existe pas déjà, on créé     
  16.             //si le login n'existe pas déjà, on créé
  17.             Utilisateur utilisateurAdd = new Utilisateur();
  18.             utilisateurAdd.setLogin(login);
  19.             utilisateurAdd.setMdp(mdp);
  20.             utilisateurAdd.setPseudo(pseudo);
  21.             utilisateurAdd.setNom(nom);
  22.             utilisateurAdd.setPrenom(prenom);
  23.             utilisateurAdd.setEtat(false);
  24.             utilisateurAdd.setIp("NULL" );
  25.             utilisateurAdd.setPort(0);
  26.             em.persist(utilisateurAdd);
  27.             try {
  28.                 logFile = new FileWriter("c:/" + date.format(new Date()) + "WSAnnuaire.log", true);
  29.                 logFile.write(heure + "Ajout d'un nouveau contact( " + login + "," + pseudo + "," + nom + "," + prenom + " ).\n" );
  30.                 logFile.close();
  31.             } catch (IOException ex) {
  32.                 Logger.getLogger(gestionUtilisateursBeans.class.getName()).log(Level.SEVERE, null, ex);
  33.             }
  34.             return 0;
  35.         } else {
  36.             return 1;
  37.         }
  38.     }


 
l'interface (qui est un webservice):

Code :
  1. @Stateless
  2. @WebService
  3. public class AnnuaireWebServices {
  4.    
  5.     @EJB(name="gestionUtilisateurs" )
  6.     private gestionUtilisateurs gestUseWS;
  7.     private static Map<String, Integer> listUsersKeys;
  8.    
  9.     public AnnuaireWebServices()
  10.     {
  11.         if (listUsersKeys == null) {
  12.             listUsersKeys = new TreeMap<String, Integer>();
  13.         }
  14.     }
  15.    
  16.     @WebMethod
  17.     public int WSInscription(@WebParam(name = "login" ) String login,@WebParam(name = "pass" ) String mdp,@WebParam(name = "pseudo" ) String pseudo,@WebParam(name = "nom" ) String nom,@WebParam(name = "prenom" ) String prenom)
  18.     {
  19.         int ret = -1;
  20.         try {
  21.             ret = gestUseWS.Inscription(login, mdp, pseudo, nom, prenom);
  22.         } catch (Exception exception) {
  23.            System.out.println("WSInscription :" + exception.toString());
  24.         }
  25.         return ret;
  26.        
  27.     }


voila si quelqu'un peut m'aider ...
 
edit:  
voici le sun-ejb-jar.xml

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
  3. <sun-ejb-jar>
  4.   <enterprise-beans>
  5.     <ejb>
  6.       <ejb-name>AnnuaireWebServices</ejb-name>
  7.       <ejb-ref>
  8.         <ejb-ref-name>gestionUtilisateurs</ejb-ref-name>
  9.         <jndi-name>corbaname:iiop:localhost:3700#Ecml.Projet.ejb.gestionUtilisateurs</jndi-name>
  10.       </ejb-ref>
  11.     </ejb>
  12.   </enterprise-beans>
  13. </sun-ejb-jar>

Message cité 1 fois
Message édité par lothar83fr le 09-11-2008 à 18:00:34
mood
Publicité
Posté le 09-11-2008 à 17:38:52  profilanswer
 

n°1810231
chichos
Posté le 09-11-2008 à 22:30:45  profilanswer
 

Bonjour,
 
étant donné la nature du message "impossible d''ajouter une ressource non-XA à une transaction JTS globale", j'aurais comme l'impression que tu fais appel à un driver SQL non-XA sur ton serveur distant.
 
As-tu bien les même configurations pour ton driver SQL sur le serveur distant ?
 
Bref, en gros, pour ta transaction globale, il te faut que tes ressources qui y participent (l'EJB, la connexion à ta base, ...)  soient toutes transactionnelles, ce qui ne semble pas être le cas ici.
 
En espérant que ce soit ça ... :)
 

lothar83fr a écrit :

bonjour
voila je suis débutant en java et j'ai un petit soucis avec mes ejbs.
lorsqu'ils tournent sur la même machine (corbaname:iiop:localhost:3700... ) tout fonctionne.
Seulement quand je met mes ejbs metiers sur un serveur distant et que je tente d'y accéder :
 
Internal Exception: java.sql.SQLException: Erreur lors de l'établissement d'une connexion. Raison : java.lang.IllegalStateException: impossible d''ajouter une ressource non-XA à une transaction JTS globale.
Error Code: 0
Call: SQLCall(INSERT INTO utilisateur (prenom, etat, login, ip, pseudo, port, timeOut, nom, mdp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?))
Query: InsertObjectQuery(Ecml.Projet.metier.Utilisateur[idUtilisateur=null])
 
gestionUtilisateur:

Code :
  1. @Remote
  2. public interface gestionUtilisateurs {
  3.    
  4.     public int Inscription(String login,String mdp,String pseudo,String nom,String prenom);
  5. ...}


 
gestionUtilisateurBean:

Code :
  1. @Stateless
  2. public class gestionUtilisateursBeans implements gestionUtilisateurs {
  3.     @PersistenceContext
  4.     private EntityManager em;
  5.     private FileWriter logFile;
  6.     private DateFormat date;
  7.     private DateFormat heure;
  8.     public gestionUtilisateursBeans() {
  9.         logFile = null;
  10.         date = new SimpleDateFormat("dd-MM-yy-" );
  11.         heure = new SimpleDateFormat("hh:mm:ss: " );
  12.     }
  13.     public int Inscription(String login, String mdp, String pseudo, String nom, String prenom) {
  14.         Query result = em.createNamedQuery("Inscription" ).setParameter("login", login);
  15.         if (result.getResultList().isEmpty() == true) { //si le login n'existe pas déjà, on créé     
  16.             //si le login n'existe pas déjà, on créé
  17.             Utilisateur utilisateurAdd = new Utilisateur();
  18.             utilisateurAdd.setLogin(login);
  19.             utilisateurAdd.setMdp(mdp);
  20.             utilisateurAdd.setPseudo(pseudo);
  21.             utilisateurAdd.setNom(nom);
  22.             utilisateurAdd.setPrenom(prenom);
  23.             utilisateurAdd.setEtat(false);
  24.             utilisateurAdd.setIp("NULL" );
  25.             utilisateurAdd.setPort(0);
  26.             em.persist(utilisateurAdd);
  27.             try {
  28.                 logFile = new FileWriter("c:/" + date.format(new Date()) + "WSAnnuaire.log", true);
  29.                 logFile.write(heure + "Ajout d'un nouveau contact( " + login + "," + pseudo + "," + nom + "," + prenom + " ).\n" );
  30.                 logFile.close();
  31.             } catch (IOException ex) {
  32.                 Logger.getLogger(gestionUtilisateursBeans.class.getName()).log(Level.SEVERE, null, ex);
  33.             }
  34.             return 0;
  35.         } else {
  36.             return 1;
  37.         }
  38.     }


 
l'interface (qui est un webservice):

Code :
  1. @Stateless
  2. @WebService
  3. public class AnnuaireWebServices {
  4.    
  5.     @EJB(name="gestionUtilisateurs" )
  6.     private gestionUtilisateurs gestUseWS;
  7.     private static Map<String, Integer> listUsersKeys;
  8.    
  9.     public AnnuaireWebServices()
  10.     {
  11.         if (listUsersKeys == null) {
  12.             listUsersKeys = new TreeMap<String, Integer>();
  13.         }
  14.     }
  15.    
  16.     @WebMethod
  17.     public int WSInscription(@WebParam(name = "login" ) String login,@WebParam(name = "pass" ) String mdp,@WebParam(name = "pseudo" ) String pseudo,@WebParam(name = "nom" ) String nom,@WebParam(name = "prenom" ) String prenom)
  18.     {
  19.         int ret = -1;
  20.         try {
  21.             ret = gestUseWS.Inscription(login, mdp, pseudo, nom, prenom);
  22.         } catch (Exception exception) {
  23.            System.out.println("WSInscription :" + exception.toString());
  24.         }
  25.         return ret;
  26.        
  27.     }


voila si quelqu'un peut m'aider ...
 
edit:  
voici le sun-ejb-jar.xml

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
  3. <sun-ejb-jar>
  4.   <enterprise-beans>
  5.     <ejb>
  6.       <ejb-name>AnnuaireWebServices</ejb-name>
  7.       <ejb-ref>
  8.         <ejb-ref-name>gestionUtilisateurs</ejb-ref-name>
  9.         <jndi-name>corbaname:iiop:localhost:3700#Ecml.Projet.ejb.gestionUtilisateurs</jndi-name>
  10.       </ejb-ref>
  11.     </ejb>
  12.   </enterprise-beans>
  13. </sun-ejb-jar>



n°1810507
lothar83fr
Posté le 10-11-2008 à 17:17:05  profilanswer
 

daccord, enfin je pensse avoir compris...
Seulement je ne sais pas comment rendre mes ressources "XA".
J'utilise le dernier driver mysql, mon persistence.xml est configuré en JTA.
La seule chose qui pourrais peut être poser problème c'est que j'utilise pour le serveur interface un glassfish d'il y a un an... alors que le serveur des ejb metiers est à jours.
J'ai peur qu'en mettant à jours le tout ne rende ensuite mon projet irrécupérable...

n°1811928
chichos
Posté le 14-11-2008 à 10:30:54  profilanswer
 

lothar83fr a écrit :

daccord, enfin je pensse avoir compris...
Seulement je ne sais pas comment rendre mes ressources "XA".
J'utilise le dernier driver mysql, mon persistence.xml est configuré en JTA.
La seule chose qui pourrais peut être poser problème c'est que j'utilise pour le serveur interface un glassfish d'il y a un an... alors que le serveur des ejb metiers est à jours.
J'ai peur qu'en mettant à jours le tout ne rende ensuite mon projet irrécupérable...


 
 
" Rendre les ressources "XA" ":
 
mon truc à moi de fainéant (mais ça fait partie des bonnes pratiques) :D  : tous mes EJB sont CMT (c'est mon serveur d'appli qui gère les transactions), mes drivers JDBC utilisés sont XA (bcp travaillé sur Oracle, tu as deux drivers différents pour le non XA et le XA, suffit de choisir le bon) et normalement, le serveur d'appli s'en sort tout seul avec son Transaction Manager : toutes les ressources impliquées savent faire le "2 phase commit" et il peut donc faire une transaction globale.  
 
Faut voir dans ta chaîne, depuis la méthode déclarée transactionnelle (une façade en général) jusqu'à ta base, quelles sont les ressources impliquées et voir s'il y en a pas une qui ne l'est pas (la partie communication en fait aussi partie, un service web n'est pas transactionnel par ex, mais bon là ça n'a pas l'air d'être ton cas, c'était pour l'exemple)
 
"La seule chose qui pourrais peut être poser problème c'est que j'utilise pour le serveur interface un glassfish d'il y a un an... alors que le serveur des ejb metiers est à jours." :
 
Peut être ... mais alors là, aucune idée, peut être qu'ils implémentent des versions d'API JTA/JTS différents ? peut être que ça rien à voir ? mais là, bonne chance  :D  
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  problème EJB en remote

 

Sujets relatifs
Problème d'encodage lors d'un join.Problème Formulaires
probleme identification client avec mot de passeProbleme runserver Django
Probleme de debugage Visual Studio 8 VBProblème tout con
Driver JDBC : Probleme lors de la récupération de caractere spéciauxAgrandir une image au survol de la mignature: Problème
Probleme commandes[Weblogic] Problème de lenteur en mode debug
Plus de sujets relatifs à : problème EJB en remote


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR