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

Tomcat et TomEE Java Discussion :

JNDI et Tomcat


Sujet :

Tomcat et TomEE Java

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut JNDI et Tomcat
    Bonjour,

    J'essaye d'utiliser activeMQ avec JNDI et Tomcat mais quand je lance ma classe pour la connexion à ActiveMQ, cela me dit: Le Nom connectionFactory n'est pas lié à ce Contexte

    Je ne vois pas de ou cela provient. Voici le fichier jndi.properties:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
     
    # use the following property to configure the default connector
    java.naming.provider.url = tcp://localhost:61616
     
    # use the following property to specify the JNDI name the connection factory
    # should appear as. 
    connectionFactoryNames = connectionFactory
     
    # Queue dans laquelle le producteur doit envoyer les messages
    queue.Producteur = queueProd
     
    # Queue dans laquelle le lecteur doit récupérer les messages
    queue.Lecteur = queueLect
    web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <web-app>
    	<servlet>
    		<servlet-name>JMSContextListener</servlet-name>
    		<servlet-class>controller.JMSContextListener</servlet-class>
    	</servlet>
     
    	<listener>
    	    <listener-class>controller.JMSContextListener</listener-class>
    	</listener>
    </web-app>
    connexion:
    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
    	public Connexion(String queueUtiliser){
    	    try{
    	    	context = new InitialContext();
     
    	    	//Création d'une connexion factory
    	    	ActiveMQConnectionFactory connectionFactory = (ActiveMQConnectionFactory)context.lookup("connectionFactory" );
     
    	    	//Création d'une connexion
    	    	connection = connectionFactory.createConnection();
    	    	connection.start();
     
    	    	//Création d'une session
    	    	session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     
    	    	//Création d'une destination
    	    	destination = (Destination) context.lookup(queueUtiliser);
    	    }catch (Exception e) {
    			System.out.println("Caught Exception: " + e);
    			e.printStackTrace();
    		}
    	}
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Salut,

    Si tes professeurs t'imposent d'utiliser le fichier JNDI, ce n'est surement pas pour que tu utilises ActiveMQInitialContextFactory de manière explicite dans le code, d'ailleurs tu ne dois rien utiliser de org.apache.activemq.*

    Tu as essayé :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Context context = new InitialContext();
    Context jmsContext = (Context) context.lookup("java:comp/env/jms");
    ConnectionFactory connectionFactory = (ConnectionFactory) jmsContext.lookup("connectionFactory");

    Ou :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Context context = new InitialContext();
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:comp/env/jms/connectionFactory");

    ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il faudrait que j'utilise quoi alors

  4. #4
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Ceci :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Context context = new InitialContext();
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:comp/env/jms/connectionFactory");
    fonctionne ou ne fonctionne pas ?
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    En faite, je ne peut pas utiliser de JNDI properties avec TOMCAT. J'ai du créer un context.xml que j'ai placé dans META-INF
    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
    <Context antiJARLocking="true">
    <Resource
    	name="connectionFactory"
    	auth="Container"
    	type="org.apache.activemq.ActiveMQConnectionFactory"
    	description="JMS Connection Factory"
    	factory="org.apache.activemq.jndi.JNDIReferenceFactory"
    	brokerURL="tcp://localhost:61616"
    	brokerName="LocalActiveMQBroker"
    	useEmbeddedBroker="false"/>
     
    <Resource name="queue/producteur"
    	auth="Container"
    	type="org.apache.activemq.command.ActiveMQQueue"
    	factory="org.apache.activemq.jndi.JNDIReferenceFactory"
    	physicalName="producteur"/>
     
    <Resource name="queue/lecteur"
    	auth="Container"
    	type="org.apache.activemq.command.ActiveMQQueue"
    	factory="org.apache.activemq.jndi.JNDIReferenceFactory"
    	physicalName="producteur"/>
    </Context>
    et faire comme ceci pour la connexion:

    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
    	        InitialContext initialContext = new InitialContext();
    	        context = (Context) initialContext.lookup("java:comp/env");
     
    	        //Création d'une connexion factory
    	    	ConnectionFactory connectionFactory = (ConnectionFactory)context.lookup("connectionFactory");
     
    	    	//Création d'une connexion
    	    	connection = connectionFactory.createConnection();
    	    	connection.start();
     
    	    	//Création d'une session
    	    	session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     
    	    	//Création d'une destination
    	    	destination = (Destination) context.lookup(queueUtiliser);
    Et pourquoi je ne pouvais pas utiliser ceci dans le JNDI.properties:
    org.apache.activemq.jndi.ActiveMQInitialContextFactory

  6. #6
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    Ah là tu vois je m'en veux un peu, parce que j'avais moi aussi trébuché sur ce problème avant de découvrir la solution (http://activemq.apache.org/tomcat) et de la partager avec les gens de ma promo y a 3 ans... j'aurais du m'en rendre compte en voyant ton fichier web.xml que c'était un projet JEE mais j'avais complètement oublié cette subtilité...
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Et si j'avais pas fait de jee, j'aurai utiliser mon fichier jndi.properties et j'aurais du mettre quoi à la place de ce que j'appeler dans initial context

  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
    tu peux utiliser un fichier jndi.properties avec tomcat, c'est juste que ce fichier ne forme pas le contexte par défaut, puisque tomcat fournis déjà un contexte. Un truc dans ce gout là était jouable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Properties props = new Properties();
    props.load(new FileInputStream("/chemin/vers/ton/jndi.properties");
    context = new InitialContext(props);
    connectionFactory = (ConnectionFactory)context.lookup("connectionFactory" );
    Mais c'est franchement mieux de faire comme tu as fini: avec la config standard de tomcat

  9. #9
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    D'accord, mais si je veux pouvoir adapter ma classe connexion selon le context. En faite, que je soit en J2ee avec TOMCAT ou en environnement normal, je souhaite ne pas changer ma classe connexion. Or là, elle ne fonctionne plus avec mon JNDI.properties:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	    try{
    	        InitialContext initialContext = new InitialContext();
    	        context = (Context) initialContext.lookup("java:comp/env");
     
    	        //Création d'une connexion factory
    	    	ConnectionFactory connectionFactory = (ConnectionFactory)context.lookup("connectionFactory");
     
    	    	//Création d'une connexion
    	    	connection = connectionFactory.createConnection();
    	    	connection.start();
    Et dans mon fichier JNDI.properties, j'aurais du mettre quoi dans mon initial context si j'ai pas mi la bonne chose

  10. #10
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    C'est quoi qui ne fonctionne plus exactement ? Quels sont tes messages d'erreurs ?

    J'ai pensé à toi et uploadé les fichiers de configurations JMS que j'avais oublié dans mon Github, c'est cadeau, n'hésite pas à t'en inspirer (sans copier bêtement) et de partager avec tes camarades de la Miage de Sorbonne (avec les amitiés d'un ancien Miagiste ).

    PS: L'avantage de l'exemple de _tchize (que je n'ai pas testé) est que ce dernier sera compatible avec n'importe quel serveur d'application, par contre celui du context.xml de Tomcat est plus simple à gérer mais spécifique à Tomcat.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  11. #11
    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
    Citation Envoyé par totot Voir le message
    D'accord, mais si je veux pouvoir adapter ma classe connexion selon le context. En faite, que je soit en J2ee avec TOMCAT ou en environnement normal, je souhaite ne pas changer ma classe connexion.
    Ben en général, pour ce qui touche au jndi, la configuration: on fait dans le conteneur en fonction du conteneur, c'est de la configuration de serveur en fait...
    Et il faut suivant le conteneur rajouter un fichier de config spécifique qui lie des entrées globales JNDI au entrée locales de l'application. Exemple: lier java:comp/env/connectionFactory => java:global/jsm/activeMQConnection factory
    Pour ce qui est d'accéder, on y accède via java:comp/env, qui est local à l'application déployée dans le conteneur et est défini dans la spec JavaEE. Cette partie est dans le code de ta classe connexion, pas besoin de l'adapter à chaque conteneur donc.


    Si tu veux absolument passer par un fichier properties, je t'ai donné le code. Mais ce n'est pas du tout dans la philosophie javaEE.

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    En faite ma question c'est comment je vais pouvoir réutiliser le même code de la classe quelque soit l'environnement: Java J2ee avec TOMCAT et donc un context.xml ou JAVA normal et donc un JNDI.properties

  13. #13
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    N'hésite pas à regarder mon repository sur Github pour avoir ta réponse.

    Le code ne change pas vraiment entre les 2 environnements :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Java SE | Configuration avec jndi.properties
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("connectionFactory");
     
    // Java EE | Configuration avec context.xml de Tomcat
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:comp/env/jms/connectionFactory");

    Tu remarqueras que seul la chaine change, tu peux soit utiliser un paramètre de constructeur/méthode, soit tenter d'injecter des paramètres au lancement de ton programme (pour Tomcat c'est un peu plus compliqué car tu risques de toucher à des fichiers mais c'est faisable si tu cherches bien) :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Paramètre de constructeur/méthode
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(arg);
     
    // System property
    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(System.getProperty("connection_factory_name"));
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

Discussions similaires

  1. Utilisation du contexte JNDI de Tomcat
    Par anisj1m dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 23/01/2012, 09h47
  2. JNDI sous Tomcat, class not found exception
    Par ChristopheH dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 19/12/2009, 01h24
  3. JNDI et Tomcat
    Par guicecal dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 08/12/2009, 10h17
  4. Problème de configuration de datasources via JNDI dans tomcat
    Par flo_rian dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 11/06/2009, 10h21
  5. Tomcat 6 + JNDI
    Par Dvoraky dans le forum Tomcat et TomEE
    Réponses: 16
    Dernier message: 28/02/2008, 11h28

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