Tomcat contre Weblogic JNDI Lookup

les serveurs Weblogic que nous utilisons ont été configurés pour permettre des noms de sources de données JNDI comme"appds".

pour le développement (localhost), il se peut que nous exécutions Tomcat et que nous soyons déclarés dans la section du serveur.xml, Tomcat accrochera les sources de données JNDI sur "java: comp/env/ jdbc / *" dans l'arbre JNDI.

problème: dans Weblogic, la recherche JNDI est "appds" tandis que dans Tomcat, il semble que je dois fournir le formel "java: comp/env/jdbc / appds". Je crains que la version Tomcat soit un standard implicite, mais malheureusement, je ne peux pas changer la configuration de Weblogic ... cela signifie que nous nous retrouvons avec deux fichiers de configuration de printemps différents (nous utilisons spring 2.5) pour faciliter les différents environnements.

y a-t-il une façon élégante d'aborder cette question. Je peux regarder les noms de JNDI directement dans Tomcat? Le printemps peut-il prendre un nom et regarder aux deux endroits? Les recherches sur Google ou les suggestions seraient excellentes.

25
demandé sur Luther Baker 2008-09-06 21:13:14

8 réponses

JndiLocatorSupport a un bien resourceRef . Lors de la mise en place de ce true, le préfixe "java:comp/env/" sera activé automatiquement. Je pense donc qu'il serait correct de différencier ce paramètre lors du passage de Tomcat à Weblogic.

10
répondu martsraits 2009-01-14 19:37:29

comment utiliser un nom JNDI unique dans votre application web

j'ai moi-même lutté avec ça pendant quelques mois. La meilleure solution est de rendre votre application portable de sorte que vous avez le même nom JNDI dans les deux Tomcat et Weblogic.

pour ce faire, vous changez vos web.xml et spring-beans.xml pour pointer vers un seul nom jndi, et fournir une correspondance à chaque nom JNDI spécifique à chaque vendeur.

J'ai placé chaque fichier ci-dessous.

Vous avez besoin de:

  • Un <resource-ref /> entrée dans le web.xml pour votre application d'utiliser un nom unique
  • Un fichier WEB-INF/weblogic.xml à la carte votre nom jndi de la gestion des ressources par WebLogic
  • Un fichier META-INF/context.xml à la carte votre nom jndi de la gestion des ressources par Tomcat
    • cela peut être dans L'installation Tomcat ou dans votre application.

en règle générale, préférez avoir vos noms jndi dans votre application comme jdbc/MyDataSource et jms/ConnFactory et évitez de les préfixer avec java:comp/env/ .

en outre, les sources de données et les usines de connexion sont mieux gérées par le conteneur et utilisé avec JNDI. C'est une erreur courante d'instancier des pools de connexion de base de données dans votre application .

printemps

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

<jee:jndi-lookup jndi-name="jdbc/appds"
                 id="dataSource" />
</beans>

web.xml

<resource-ref>
    <description>My data source</description>
    <res-ref-name>jdbc/appds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

weblogic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">

<resource-description>
    <jndi-name>appds</jndi-name>
    <res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>

META-INF/context.xml (pour Tomcat)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>
19
répondu Leonel 2017-05-23 11:54:50

J'ai géré le truc avec Tomcat et WebLogic en utilisant Spring. ici est une description de comment cela a fonctionné pour moi.

2
répondu duffymo 2009-06-19 10:23:35

la configuration suivante fonctionne en Tomcat et Weblogic pour moi.

Au Printemps:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>

dans la Console D'administration Weblogic créer une ressource JDBC nommée jdbc/AgriShare . Sous "Targets", , assurez-vous de cibler la source de données sur le serveur vers lequel vous déployez votre application! . Ce point particulier m'a coûté du temps tout à l'heure...

2
répondu Val Blant 2011-08-09 19:23:38

pourquoi pas une variable d'environnement? Set developers machines avec le nom tomcat et production avec le nom Weblogic. Vous pouvez même configurer votre code pour utiliser un code par défaut (WebLogic) dans le cas où la variable n'existe pas.

1
répondu Marcio Aguiar 2008-09-07 05:18:20

Comment faites-vous référence à la ressource au printemps?

c'est ce que nous avons pour tomcat:

contexte:

<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>

le printemps:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
                         expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>

l'espace de noms jee vient de:

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

1
répondu harmanjd 2009-01-14 20:34:46

configurer DataSource dans l'application elle-même n'est pas si fou :) je dirais que c'est même obligatoire si l'application est censée être déployée sur une grille. Rivière, GigaSpaces, ou similaire.

Note: Je ne dis pas que les paramètres de connexion doivent être codés en dur à L'intérieur de WAR, ils doivent être fournis au moment du déploiement/de l'exécution. Cela simplifie la gestion des instances cloud puisqu'il n'y a qu'un seul endroit pour configurer.

configurer les ressources à le conteneur n'a de sens que si plusieurs applications y sont déployées et qu'elles peuvent utiliser des ressources partagées.

encore une fois, dans les déploiements de type cloud, il n'y a qu'une application par instance de conteneur servlet.

1
répondu Konstantin 2011-01-27 19:21:47

ma demande avait aussi un problème similaire et c'est ainsi que je l'ai résolu:

1) WEB-INF/classes/application.properties contient la mention:

ds.jndi=java:comp/env/jdbc/tcds

2) sur la machine WLS, j'ai une entrée dans le fichier /etc/sysenv :

ds.jndi=wlsds

3) j'ai configuré spring pour rechercher le JNDI vis la propriété ${ds.jndi} , en utilisant un PropertyPlaceholderConfigurer avec classpath:application.properties et file:/etc/sysenv comme emplacements. J'ai aussi mis le ignoreResourceNotFound true de sorte que les développeurs n'ont pas besoin d'avoir /etc/sysenv sur leurs machines.

4) j'ai effectué un test d'intégration en utilisant Cargo+Jetty et je ne pouvais pas correctement mettre en place un environnement JNDI là-bas. Donc j'ai un repli BasicDataSource configuré aussi en utilisant la propriété defaultObject de JndiObjectFactoryBean .

0
répondu Binil Thomas 2008-09-08 20:07:44