2008-09-06 17 views
25

Los servidores Weblogic que estamos utilizando han sido configurados para permitir nombres de fuentes de datos JNDI como "appds".Tomcat vs Weblogic JNDI Lookup

para el desarrollo (localhost), podríamos estar ejecutando Tomcat y cuando se declaran en la sección de > < contexto de server.xml, Tomcat ahorquemos fuentes de datos JNDI en "java: comp/env/jdbc/*" en el árbol JNDI .

Problema: en Weblogic, la búsqueda JNDI es "appds", mientras que en Tomcat, parece que que debo proporcionar lo formal "java: comp/env/jdbc/appds". Me temo que la versión de Tomcat es un estándar implícito, pero desafortunadamente no puedo cambiar la configuración de Weblogic ... así que eso significa que terminamos con dos archivos de configuración de primavera diferentes (estamos usando la primavera 2.5) para facilitar los diferentes entornos.

¿Hay una manera elegante de abordar esto. ¿Puedo buscar nombres JNDI directamente en Tomcat? ¿Puede Spring tomar un nombre y buscar en ambos lugares? Las búsquedas o sugerencias de Google serían geniales.

Respuesta

9

JndiLocatorSupport tiene una propiedad resourceRef. Al configurar esto, el prefijo "java: comp/env /" se agregará automáticamente. Por lo tanto, creo que sería correcto diferenciar este parámetro al pasar de Tomcat a Weblogic.

1

¿Qué tal una variable de entorno? Establezca máquinas de desarrolladores con el nombre de Tomcat y la producción con el nombre de Weblogic. Incluso puede configurar su código para usar uno predeterminado (WebLogic) en caso de que la variable no exista.

0

Mi aplicación también tuvo un problema similar y es así como lo resolví:

1) WEB-INF/classes/application.properties contiene la entrada:

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

2) En la máquina de WLS, tengo una entrada en el /etc/sysenv archivo:

 
ds.jndi=wlsds 

3) que configura la primavera para buscar el JNDI vis la propiedad ${ds.jndi}, utilizando un PropertyPlaceholderConfigurer haber una con classpath:application.properties y file:/etc/sysenv como ubicaciones. También configuro el ignoreResourceNotFound en true para que los desarrolladores no necesiten tener /etc/sysenv en sus máquinas.

4) Ejecuto una prueba de integración con Cargo + Jetty y no pude establecer correctamente un entorno JNDI allí. Así que tengo un BasicDataSource de reserva configurado también usando la propiedad defaultObject de JndiObjectFactoryBean.

1

¿Cómo hace referencia al recurso en la primavera?

Esto es lo que tenemos para Tomcat:

contexto:

<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"/> 

primavera:

<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"/> 

El espacio de nombres Jee proviene de:

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

+0

¿Por qué está utilizando las bibliotecas de ActiveMQ para conectarse a weblogic? – wmarbut

2

He logrado el truco con Tomcat y WebLogic con Spring. Here es una descripción de cómo funcionó para mí.

19

Cómo utilizar un solo nombre JNDI en su aplicación web

he luchado con esto durante unos meses yo mismo. La mejor solución es hacer que su aplicación sea portátil para que tenga el mismo nombre JNDI en Tomcat y Weblogic.

Para hacer eso, cambie su web.xml y spring-beans.xml para que apunte a un solo nombre de jndi y proporcione una asignación al nombre jndi específico de cada proveedor.

He colocado cada archivo a continuación.

que necesita:

  • Un <resource-ref /> entrada en web.xml para su aplicación para utilizar un solo nombre
  • Un archivo WEB-INF/weblogic.xml para mapear su nombre JNDI para el recurso gestionado por WebLogic
  • Un archivo META-INF/context.xml para asignar su nombre de jndi al recurso administrado por Tomcat
    • Esto puede ser en la instalación de Tomcat o en su aplicación.

Como regla general, prefieren tener sus nombres JNDI en su aplicación como jdbc/MyDataSource y jms/ConnFactory y evitar un prefijo con java:comp/env/.

Además, las fuentes de datos y las fábricas de conexiones se manejan mejor con el contenedor y se usan con JNDI. Es un common mistake to instantiate database connection pools in your application.

resorte

<?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 (para Tomcat)

<Context> 
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/> 
</Context> 
1

Configuración de origen de datos en la aplicación en sí no es tan loco :) Yo diría que es incluso obligatoria si la aplicación está destinado a ser desplegado en una cuadrícula. River, GigaSpaces o similar.

Nota: No digo que los ajustes de conexión tengan que estar codificados dentro de WAR, deben ser suministrados en tiempo de implementación/tiempo de ejecución. Esto simplifica la administración de instancias en la nube ya que solo hay lugar para configurar.

La configuración de recursos en el contenedor solo tiene sentido si se implementan múltiples aplicaciones allí y pueden usar recursos compartidos.

De nuevo, en el tipo de despliegue en la nube solo hay una aplicación por instancia de contenedor de servlet.

2

La siguiente configuración funciona en Tomcat y Weblogic para mí.

En primavera:

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

En Weblogic consola de administración crear un recurso JDBC llamado jdbc/AgriShare. Debajo de 'Objetivos', ASEGÚRESE DE ESTAR DIRIGIDO AL DATASOURCE AL SERVIDOR EN EL QUE USTED ESTÁ DESPLEGANDO SU APLICACIÓN.. Este punto en particular me costó un poco de tiempo ahora ...

Cuestiones relacionadas