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