java - example - tomcat connection pool monitoring
Usar un origen de datos JNDI creado por otra aplicaciĆ³n con Tomcat (5)
Algunas personas ya han comentado sobre esto, pero creo que la respuesta a su pregunta es: Tomcat tiene un archivo llamado server.xml que necesita usar. Una buena referencia que he usado antes está a continuación:
http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html
Los recursos definidos aquí serán visibles para todas las aplicaciones implementadas (si están configuradas correctamente). Si configura un recurso JNDI en su contexto de aplicaciones o archivo web xml, solo debería estar disponible para su aplicación.
Tengo un archivo .properties en mi aplicación que contiene propiedades de fuente de datos. Configuré una referencia JNDI a este dataSource usando el siguiente código:
// first I create MyDataSource from the properties found in the .properties file
//then :
Context initContext = new InitialContext();
initContext.createSubcontext("jdbc");
initContext.createSubcontext("jdbc/oracle");
initContext.rebind(jdbc/oracle/myDataSource, MyDataSource);
Si uso una búsqueda en esta aplicación, se encuentra el dataSource:
Context initContext = new InitialContext();
BasicDataSource dataSource =
(BasicDataSource) initContext.lookup("jdbc/oracle/myDataSource")
//everything works fine and I can use my dataSource to getConnection,
//requests, etc...
Ahora me gustaría usar este dataSource en otra aplicación. Pero si hago la misma búsqueda que antes, no encuentro myDataSource (mientras que todavía hay la aplicación anterior en tomcat y la vinculación de jndi se realiza en la puesta en marcha con la ayuda de un oyente).
¿Cómo puedo obtener myDataSource en esta segunda aplicación, dado que no puedo usar un recurso de Tomcat en server.xml o un archivo context.xml (por diferentes razones tengo que usar este archivo .properties)?
Gracias
El contexto JNDI es privado para cada aplicación web. El contexto creado en una aplicación no puede ser accedido por otros.
Intenta crear una entrada en GlobalNamingResources y enlaces en ambos webapps usando <ResourceLink>
para ver si funciona.
Utilicé esta configuración antes para leer desde ambas aplicaciones pero nunca intenté escribir desde una. Entonces no estoy seguro de si funcionará.
Lo que estás tratando de hacer no va a funcionar. Las aplicaciones J2EE no pueden modificar el entorno JNDI proporcionado por el servidor de aplicaciones (especificación J2EE, sección 5.2.2) y la documentación JNDI de Tomcat también establece que cada aplicación web tiene cada entorno JNDI de solo lectura. No estoy seguro de por qué enlazar / volver a enlazar su fuente de datos no está fallando inmediatamente y por qué está funcionando dentro de la misma aplicación web, pero incluso ese uso interno de la aplicación del entorno JNDI es un comportamiento no documentado, del cual no confiaría.
los directorios JDNI "locales" son de solo lectura en Tomcat. Sin embargo, puede vincular recursos JNDI "globales" en un LifecycleListener, y luego "vincularlos" a su contexto (s) (*):
Necesita implementar org.apache.catalina.LifecycleListener http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/LifecycleListener.html
Luego regístrelo en su server.xml de esta manera (junto con los otros oyentes):
<Listener className="yourlistener.YourLifecycleListener"/>
Su oyente debe esperar 2 eventos:
public void lifecycleEvent(final LifecycleEvent event) {
if (Lifecycle.START_EVENT.equals(event.getType())) {
// Create your datasource instance...
Context initContext = new InitialContext();
initContext.createSubcontext("jdbc");
initContext.createSubcontext("jdbc/oracle");
initContext.rebind("jdbc/oracle/myDataSource", myDataSource);
} else if (Lifecycle.STOP_EVENT.equals(event.getType())) {
// unbind...
}
}
A continuación, deberá propagar los accesos a los recursos "vinculándolos" desde el directorio JNDI "global" al directorio JNDI "local" utilizando el elemento ResourceLink en su META-INF / context.xml:
<ResourceLink name="jdbc/oracle/myDataSource" global="jdbc/oracle/myDataSource"
type="javax.sql.DataSource" />
Eso funcionó para mí hasta ahora.
(*) Algunas notas:
Hay una ventaja al usar oyentes de ciclo de vida. Dado que el orden de creación del contexto no está garantizado. La ventaja es que todos sus contextos verán este objeto creado.
Si necesita crear y configurar la creación del origen de datos de forma más dinámica que en la creación del detector de ciclo de vida, tenga en cuenta que puede enlazar una clase personalizada que implemente el patrón de fábrica.
Para evitar la carga de clases de problemas de incompatibilidad, considere colocar sus clases de detector, fuente de datos, etc. en un archivo jar en el directorio lib de Tomcat, para que estén incluidos en el cargador de clases común.
Saludos.
En realidad, es posible acceder a otros recursos JNDI, si el servlet implementa org.apache.catalina.ContainerServlet . Esta interfaz tiene un atributo org.apache.catalina.Wrapper, que es "poblado" por el propio contenedor.
a través de eso, creé una aplicación simple para monitorear recursos.
PERO, me gustaría hacer eso en un oyente, para que mi monitor de recursos pueda comenzar cuando comience el contenedor. Alguien sabe una manera?