problème EJB en remote

problème EJB en remote - Java - Programmation

Marsh Posté le 09-11-2008 à 17:38:52    

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
Reply

Marsh Posté le 09-11-2008 à 17:38:52   

Reply

Marsh Posté le 09-11-2008 à 22:30:45    

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>



Reply

Marsh Posté le 10-11-2008 à 17:17:05    

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...

Reply

Marsh Posté le 14-11-2008 à 10:30:54    

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  
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed