Pregunta

Los servidores Weblogic que estamos utilizando se han configurado para permitir nombres de fuentes de datos JNDI como "appds".

Para el desarrollo (localhost), es posible que estemos ejecutando Tomcat y cuando se declare en la sección <context> de server.xml, Tomcat colgará las 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 debo proporcionar el "java:comp/env/jdbc/appds" formal.Me temo que la versión de Tomcat es un estándar implícito, pero desafortunadamente no puedo cambiar la configuración de Weblogic...Eso significa que terminamos con dos archivos de configuración de Spring diferentes (estamos usando Spring 2.5) para facilitar los diferentes entornos.

¿Existe 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 en Google serían geniales.

¿Fue útil?

Solución

JndiLocatorSupport tiene una propiedad resourceRef.Cuando se establece esto como verdadero, el prefijo "java:comp/env/" se antepondrá automáticamente.Entonces creo que sería correcto diferenciar este parámetro al pasar de Tomcat a Weblogic.

Otros consejos

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

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

Para hacer eso, cambia tu web.xml y spring-beans.xml para apuntar a un único nombre jndi y proporcionar una asignación a cada nombre jndi específico del proveedor.

He colocado cada archivo a continuación.

Necesitas:

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

Como regla general, prefiera tener sus nombres jndi en su aplicación como jdbc/MyDataSource y jms/ConnFactory y evite anteponerlos con java:comp/env/.

Además, las fuentes de datos y las fábricas de conexiones se gestionan mejor mediante el contenedor y se utilizan con JNDI.Es un error común al crear instancias de grupos de conexiones de bases de datos en su aplicación.

primavera

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

Logré el truco con Tomcat y WebLogic usando Spring. Aquí es una descripción de cómo funcionó para mí.

La siguiente configuración me funciona en Tomcat y Weblogic.

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 Admin Console cree un recurso JDBC llamado jdbc/AgriShare.En 'Objetivos', ¡ASEGÚRESE DE ORIENTAR LA FUENTE DE DATOS AL SERVIDOR EN EL QUE ESTÁ IMPLEMENTANDO SU APLICACIÓN!.Este punto en particular me costó algo de tiempo hace un momento...

¿Qué tal una variable ambiental?Configure las máquinas de los 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.

¿Cómo hace referencia al recurso en 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/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

Configurar DataSource en la aplicación en sí no es tan loco :) Yo diría que incluso es obligatorio si la aplicación debe implementarse en una red.River, GigaSpaces, o similares.

Nota:No digo que las configuraciones de conexión deban estar codificadas dentro de WAR, deben proporcionarse en el momento de la implementación/ejecución.Esto simplifica la gestión de instancias en la nube, ya que solo hay un lugar para configurar.

Configurar recursos en el contenedor solo tiene sentido si se implementan allí varias aplicaciones y pueden utilizar recursos compartidos.

Nuevamente, en las implementaciones de tipo nube, solo hay una aplicación por instancia de contenedor de servlet.

Mi aplicación también tenía un problema similar y así lo resolví:

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

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

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

ds.jndi=wlsds

3) Configuré Spring para buscar JNDI en la propiedad ${ds.jndi}, usando un PropertyPlaceholderConfigurer frijol con classpath:application.properties y file:/etc/sysenv como ubicaciones.También puse el ignoreResourceNotFound a true para que los desarrolladores no tengan que tener /etc/sysenv en sus máquinas.

4) Realicé una prueba de integración usando Cargo+Jetty y no pude configurar correctamente un entorno JNDI allí.Entonces tengo una alternativa BasicDataSource configurado también usando el defaultObject propiedad de JndiObjectFactoryBean.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top