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

JDBC Java Discussion :

Camel JNDI et JDBC probleme


Sujet :

JDBC Java

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut Camel JNDI et JDBC probleme
    Bonjour

    je défini avec camel-blueprint des bundles OSGI contenant des routes camel qui utilisent des connexions JDBC.

    sous OSGI je sais définir une datasource et je sais depuis mon bundle camel la retrouver.
    OSGI fourni un service JNDI qui fonctionne sans trop de difficulté.

    Mon problème vient de JUNIT
    lorsque je teste mes composants camel avec JUNIT camel fournit une classe CamelTestSupport

    voici ce que fait cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        protected Context createJndiContext() throws Exception {
            Properties properties = new Properties();
     
            // jndi.properties is optional
            InputStream in = getClass().getClassLoader().getResourceAsStream("jndi.properties");
            if (in != null) {
                log.debug("Using jndi.properties from classpath root");
                properties.load(in);
            } else {            
    //JE PASSE PAR ICI
                properties.put("java.naming.factory.initial", "org.apache.camel.util.jndi.CamelInitialContextFactory"); 
            }
            return new InitialContext(new Hashtable(properties));
        }
    dans mon code lorsque mon constructeur de route prépare la route il fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    final InitialContext reg = new InitialContext();
    reg.bind("jdbc/myDatasource", dataSource);
    ou datasource est une datasource que je viens de créer.

    plus loin dans le code je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    InitialContext namingContext = new InitialContext();
    dataSource = (DataSource) namingContext.lookup("jdbc/myDatasource");
    et j'ai une erreur. comme quoi il ne trouve pas la datasource.
    Je suis passé en debug pas à pas et chaque appel à InitialContext me retourne un objet différent. je ne sais pas si c'est normal.

    en inspectant le contenu j'ai :

    après le premier InitialContext bindings et environnement de l'objet retourné contiennent java.naming.factory.initial=org.apache.camel.util.jndi.CamelInitialContextFactory.

    après le bind bindings et environnement de l'objet retourné contiennent java.naming.factory.initial=org.apache.camel.util.jndi.CamelInitialContextFactory. et treeBindings contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jdbc/transcoDataSource=com.mchange.v2.c3p0.PoolBackedDataSource@76313fc7 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@c51f7c3c [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 2yscvx8mm2k4at3zeyd5|515979, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@c1558ebb [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 2yscvx8mm2k4at3zeyd5|780024, jdbcUrl -> jdbc:derby:datas/transcodb;create=true, properties -> {} ], preferredTestQuery -> null, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 2yscvx8mm2k4at3zeyd5|c92575, numHelperThreads -> 3 ]
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jdbc=org.apache.camel.util.jndi.JndiContext@53d34c
    après le troisième InitialContext bindings et environnement de l'objet retourné contiennent java.naming.factory.initial=org.apache.camel.util.jndi.CamelInitialContextFactory. et treeBindings est vide {}

    du coup le me suis demandé s'il ne fallait pas passer les mêmes properties à InitialContext() mais ça ne change rien.

    merci de votre aide
    A+JYT

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Bonjour

    je me réponds à moi-même.

    le petit doute sur le fait que InitialContext me retournait systématiquement un JndiContext différent était la bonne voie pour comprendre ce qu'il se passait.

    CamelTestSupport fournit donc une méthode appelée automatiquement pour créer un JndiContext

    Mais l'équipe Camel a du estimer que lors de test JUNIT il n'était pas nécessaire de créer un vrai service Jndi car s'il créent bien un objet JndiContext le problème est qu'il en crée un nouveau à chaque appel.

    la solution vient de CamelInitialContextFactory qui est la factory utilisé par défaut par CamelTestSupport.

    pour en changer et utiliser sa propre factory il faut ajouter dans le classPath un fichier jndi.properties.
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    java.naming.factory.initial = fr.foo.CamelInitialContextFactory
    de fournir la factory fr.foo.CamelInitialContextFactory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class CamelInitialContextFactory extends org.apache.camel.util.jndi.CamelInitialContextFactory {
        private static Context jndiContext = null;
     
       @Override
        public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
          if (null == jndiContext) {
             jndiContext = super.getInitialContext(environment);
          }
          return jndiContext;
        }
    }
    Pour ajouter une datasource dans la Registry il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    final InitialContext reg = new InitialContext();
    reg.bind("jdbc/myDatasource", dataSource);
    et pour la lire avec les méthodes camel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Registry reg = getContext().getRegistry();
    dataSource = (DataSource) reg.lookup("jdbc/myDatasource");
    ou avec jndi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    InitialContext reg = new InitialContext();
    dataSource = (DataSource) reg.lookup("jdbc/myDatasource");
    A+JYT

Discussions similaires

  1. [JDBC]Probleme curseur SQL
    Par Welldone dans le forum JDBC
    Réponses: 13
    Dernier message: 11/07/2005, 16h57
  2. [JDBC] probleme avec les transactions
    Par lthomas dans le forum JDBC
    Réponses: 2
    Dernier message: 17/06/2005, 17h10
  3. [weblogic 8.1][JDBC] Probleme avec une requete
    Par Sniper37 dans le forum Weblogic
    Réponses: 3
    Dernier message: 08/04/2005, 11h11
  4. Réponses: 4
    Dernier message: 15/01/2005, 16h05
  5. Réponses: 13
    Dernier message: 10/05/2004, 16h49

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