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>