java tomcat java-ee weblogic jndi

java - Tomcat vs búsqueda Weblogic JNDI



java-ee (8)

¿Cómo estás haciendo 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 de jee proviene de:

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

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

Para el desarrollo (localhost), podríamos estar ejecutando Tomcat y cuando se declare en la sección <context> de server.xml, Tomcat bloqueará 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 ... 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.


¿Qué tal una variable ambiental? 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.


Configurar DataSource en la aplicación en sí no es tan descabellado :) Diría que es incluso obligatorio si la aplicación debe implementarse en una grilla. River, GigaSpaces o similar.

Nota: No digo que las configuraciones de conexión tengan que estar codificadas dentro de WAR, deben ser suministradas en tiempo de despliegue / 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 implementación en la nube solo hay una aplicación por instancia de contenedor de servlet.


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 la Consola de administración de Weblogic, cree un recurso JDBC llamado jdbc/AgriShare . Debajo de ''Objetivos'', ¡ ASEGÚRESE DE ESTAR DIRIGIDO AL DATASOURCE PARA EL SERVIDOR QUE USTED ESTÁ IMPLEMENTANDO SU APLICACIÓN! . Este punto en particular me costó un poco de tiempo ahora ...


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


Mi aplicación también tenía un problema similar y así es como 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 :

ds.jndi=wlsds

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

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


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.


Cómo usar 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 hacerlo, cambie su web.xml y spring-beans.xml para que apunten 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.

Necesitas:

  • Una entrada <resource-ref /> en web.xml para que su aplicación use un solo nombre
  • Un archivo WEB-INF/weblogic.xml para asignar su nombre de jndi al recurso administrado 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 tu aplicación.

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

Además, las fuentes de datos y las fábricas de conexiones se gestionan mejor mediante el contenedor y se usan con JNDI. Es un error común 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>