Desarrollo de aplicaciones que utilizan JNDI
Referencias a inicios de enterprise bean (EJB) y otros artefactos como los orígenes de datos se enlazan al espacio de nombres de WebSphere Application Server. Estos objetos se pueden obtener a través de JNDI (Java™ Naming and Directory Interface). Antes de realizar ninguna operación JNDI, tendrá que obtener un contexto inicial. Puede utilizar el contexto inicial para buscar objetos enlazados con el espacio de nombres.
Acerca de esta tarea
En estos ejemplos, se utiliza el comportamiento por omisión de las características específicas a la implementación del contexto JNDI de WebSphere Application Server.
La implementación del contexto JNDI de WebSphere Application Server incluye características especiales. El almacenamiento en memoria caché de JNDI mejora el rendimiento de operaciones de búsqueda repetidas en los mismos objetos. Las opciones de sintaxis de nombre ofrecen una opción de sintaxis de nombre, una optimizada para clientes de JNDI típicos y otra optimizada para interoperatividad con aplicaciones de CosNaming. La mayoría del tiempo, el comportamiento por omisión de estas características es el preferido. No obstante, algunas veces debería modificar el comportamiento para situaciones específicas.
El almacenamiento en memoria caché de JNDI y las opciones de sintaxis de nombre están asociadas a la instancia de javax.naming.InitialContext. Para seleccionar opciones para estas características, establezca propiedades que sean reconocidas por la fábrica de contexto inicial de WebSphere Application Server. Para establecer las propiedades de almacenamiento en memoria caché de JNDI o de sintaxis de nombres que pueda ver la fábrica de contexto inicial, realice los pasos siguientes:
Procedimiento
- Opcional: Configure las memorias caché de JNDI
El almacenamiento en memoria caché de JNDI puede aumentar notablemente el rendimiento de las operaciones de búsqueda de JNDI. De forma predeterminada, el almacenamiento en memoria caché de JNDI está habilitado. En la mayoría de las situaciones, este es el comportamiento por omisión deseado. No obstante, en situaciones específicas, utilice las otras opciones de memoria caché de JNDI.
Los objetos se almacenan localmente en memoria caché cuando se buscan. Las búsquedas subsiguientes de objetos en memoria caché se resuelven localmente. No obstante el contenido de la memoria caché se pasa a punto muerto. Esta situación no suele ser un problema, dado que la mayoría de los objetos que se buscan no cambian con mucha frecuencia. Si tiene que buscar objetos que cambian con frecuencia relativamente, cambie las opciones de memoria caché de JNDI.
Los clientes JNDI pueden utilizar varias propiedades para controlar el comportamiento de la memoria caché.
Puede establecer las propiedades:- En la línea de mandatos entrando el valor de serie actual. Por ejemplo:
java -Dcom.ibm.websphere.naming.jndicache.maxentrylife=1440
- En un archivo jndi.properties creando un archivo llamado jndi.properties como un
archivo de texto con los valores de propiedades deseados. Por ejemplo:
... com.ibm.websphere.naming.jndicache.cacheobject=none ...
Si utiliza esta técnica, tenga en cuenta que pueden existir otras instancias del archivo jndi.properties en la classpath, y pueden contener valores de propiedad que entren en conflicto. Los valores de propiedad vienen determinados por el orden en que el cargador de clases selecciona los archivos jndi.properties. No hay ningún modo de controlar el orden que utiliza el cargador de clases para localizar los archivos en la classpath. WebSphere Application Server no contiene inicialmente ni crea archivos jndi.properties que establezcan la propiedad com.ibm.websphere.naming.jndicache.cacheobject.
- En programas Java, utilizando constantes Java PROPS.JNDI_CACHE*,
definidas en el archivo com.ibm.websphere.naming.PROPS.
A continuación figuran las
definiciones de constante:
public static final String JNDI_CACHE_OBJECT = "com.ibm.websphere.naming.jndicache.cacheobject"; public static final String JNDI_CACHE_OBJECT_NONE = "none"; public static final String JNDI_CACHE_OBJECT_POPULATED = "populated"; public static final String JNDI_CACHE_OBJECT_CLEARED = "cleared"; public static final String JNDI_CACHE_OBJECT_DEFAULT = JNDI_CACHE_OBJECT_POPULATED; public static final String JNDI_CACHE_NAME = "com.ibm.websphere.naming.jndicache.cachename"; public static final String JNDI_CACHE_NAME_DEFAULT = "providerURL"; public static final String JNDI_CACHE_MAX_LIFE = "com.ibm.websphere.naming.jndicache.maxcachelife"; public static final int JNDI_CACHE_MAX_LIFE_DEFAULT = 0; public static final String JNDI_CACHE_MAX_ENTRY_LIFE = "com.ibm.websphere.naming.jndicache.maxentrylife"; public static final int JNDI_CACHE_MAX_ENTRY_LIFE_DEFAULT = 0;
Para utilizar las propiedades anteriores de programas Java, añada el valor de propiedad a una tabla hash y páselo al constructor InitialContext como se detalla a continuación:
java.util.Hashtable env = new java.util.Hashtable(); ... // Inhabilitar la captura env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); ... javax.naming.Context initialContext = new javax.naming.InitialContext(env);
A continuación, se muestran ejemplos que ilustran cómo puede utilizar las propiedades de memoria caché de JNDI para lograr el comportamiento de memoria caché deseado. Las propiedades entran en vigor al construir un objeto InitialContext.
Ejemplo: control del comportamiento de la antememoria de JNDI desde un programa
import java.util.Hashtable; import javax.naming.InitialContext; import javax.naming.Context; import com.ibm.websphere.naming.PROPS; /***** Caching discussed in this section pertains to the WebSphere Application Server initial context factory. Assume the property, java.naming.factory.initial, is set to "com.ibm.websphere.naming.WsnInitialContextFactory" as a java.lang.System property. *****/ Hashtable env; Context ctx; // Para borrar una memoria caché: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_CLEARED); ctx = new InitialContext(env); // Para establecer el tiempo de vida máximo de la memoria caché en 60 minutos: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_MAX_LIFE, "60"); ctx = new InitialContext(env); // Para desactivar el almacenamiento en memoria caché: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); ctx = new InitialContext(env); // Para utilizar almacenamiento en memoria caché y no almacenamiento en memoria caché: env = new Hashtable(); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_POPULATED); ctx = new InitialContext(env); env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_NONE); Context noCacheCtx = new InitialContext(env); Object o; // Utilizar almacenamiento en memoria caché para buscar inicio, puesto que el inicio raras veces cambia. o = ctx.lookup("com/mycom/MyEJBHome"); // Reducir, etc. ... // No utilizar memoria caché si los datos son volátiles. o = noCacheCtx.lookup("com/mycom/VolatileObject"); // ...
Ejemplo: búsqueda de una sesión de JavaMail con JNDI
El ejemplo siguiente muestra una búsqueda de un recurso JavaMail:
// Obtener el contexto inicial como se ha mostrado anteriormente ... Session session = (Session) initialContext.lookup("java:comp/env/mail/MailSession");
- En la línea de mandatos entrando el valor de serie actual. Por ejemplo:
- Opcional: Especifique la sintaxis de nombres
La sintaxis INS está diseñada para los clientes JNDI que necesitan interoperar con aplicaciones CORBA. Esta sintaxis permite que un cliente JNDI correlacione correctamente un nombre CORBA en ambos sentidos. La sintaxis INS es muy similar a la sintaxis JNDI con el carácter especial adicional del punto (.). Los puntos se utilizan para delimitar los campos id y kind en un componente de nombre. Un punto se interpreta literalmente cuando tiene escape. En un componente de nombre solamente está permitido un punto sin escape. Un componente de nombre con un campo id que no está vacío y un campo kind vacío se representa sólo con el valor del campo id y no puede finalizar con un punto sin escape. Un componente de nombre vacío (los campos id y kind están vacíos) se representa con un solo punto sin escape. Una serie vacía no es una representación de componente de nombre válida.
La sintaxis de nombres JNDI es la sintaxis predeterminada y es apta para los clientes JNDI más usuales. Esta sintaxis incluye los caracteres especiales siguientes: la barra inclinada (/) y la barra invertida (\). Los componentes de un nombre están delimitados por una barra inclinada. La barra invertida se utiliza como el carácter de escape. Una barra inclinada se interpreta literalmente como con escape, es decir, como precedida por la barra invertida. Del mismo modo, una barra invertida se interpreta literalmente como con escape.
La mayoría de las aplicaciones WebSphere utilizan JNDI para buscar objetos EJB y no tienen que buscar objetos enlazados mediante aplicaciones CORBA. Por lo tanto, la sintaxis de nombre por omisión de nombres JNDI es la más cómoda. Si en la aplicación se necesita buscar objetos enlazados mediante aplicaciones CORBA, necesitará cambiar la sintaxis de nombre para que todos los nombres CORBA CosNaming se puedan representar.
Los clientes de JNDI pueden establecer la sintaxis de nombre estableciendo una propiedad. El valor de propiedad se aplica mediante la fábrica de contexto inicial cuando crea una instancia nueva de un objeto java.naming.InitialContext. Los nombres especificados en operaciones de JNDI en el contexto inicial se analizan de acuerdo a la sintaxis de nombre especificada.
Puede establecer la propiedad:
- Desde una línea de mandatos, escriba el valor real de la serie. Por ejemplo:
java -Dcom.ibm.websphere.naming.name.syntax=ins
- Cree un archivo llamado jndi.properties como un archivo de texto con los valores de propiedades deseados. Por ejemplo:
... com.ibm.websphere.naming.name.syntax=ins ...
Si utiliza esta técnica, tenga en cuenta que pueden existir otras instancias del archivo jndi.properties en la classpath, y pueden contener valores de propiedad que entren en conflicto. Los valores de propiedad vienen determinados por el orden en que el cargador de clases selecciona los archivos jndi.properties. No hay ningún modo de controlar el orden que utiliza el cargador de clases para localizar los archivos en la classpath. WebSphere Application Server no contiene inicialmente ni crea archivos jndi.properties que establezcan la propiedad com.ibm.websphere.naming.name.syntax.
- En un programa Java, utilice las constantes Java PROPS.NAME_SYNTAX*, definidas en el archivo com.ibm.websphere.naming.PROPS. A continuación figuran las
definiciones de constante:
public static final String NAME_SYNTAX = "com.ibm.websphere.naming.name.syntax"; public static final String NAME_SYNTAX_JNDI = "jndi"; public static final String NAME_SYNTAX_INS = "ins";
Para utilizar las propiedades anteriores de programas Java, añada el valor de propiedad a una tabla hash y páselo al constructor InitialContext como se detalla a continuación:
java.util.Hashtable env = new java.util.Hashtable(); ... env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS); // Establezca la sintaxis de nombre en INS ... javax.naming.Context initialContext = new javax.naming.InitialContext(env);
Ejemplo: establecimiento de la sintaxis utilizada para analizar series de nombres
La propiedad de la sintaxis de nombres de puede pasar al constructor de InitialContext a través de su parámetro, en las propiedades del sistema o en un archivo jndi.properties. El contexto inicial y cualquier otro contexto buscado a partir de dicho contexto inicial analiza las series de nombres según la sintaxis especificada.
El ejemplo siguiente muestra la forma de establecer la sintaxis del nombre para que el contexto inicial analice las series de nombres según la sintaxis INS.
... import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import com.ibm.websphere.naming.PROPS; // Constantes de nombres de WebSphere ... Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, ...); env.put(PROPS.NAME_SYNTAX, PROPS.NAME_SYNTAX_INS); Context initialContext = new InitialContext(env); // El nombre siguiente se correlaciona con un componente de nombre CORBA así: // id = "a.name", kind = "in.INS.format" // El punto sin escape se utiliza como delimitador. // Los puntos con escape se interpretan literalmente. java.lang.Object o = initialContext.lookup("a\\.name.in\\.INS\\.format"); ...
La sintaxis de nombres INS requiere intercalar puntos (.) en un nombre como, por ejemplo, en in.INS.format con el carácter de barra invertida como carácter de escape (\). En un literal de serie Java, un carácter de barra invertida (\) debe tener otra barra invertida como carácter de escape (\\).
- Desde una línea de mandatos, escriba el valor real de la serie. Por ejemplo:
- Opcional: Inhabilitar la normalización de nombre de host
Las referencias a los nombres de host, las direcciones IP y el localhost en los URL del proveedor, normalmente están normalizadas. El formato de un nombre de host normalizado es la forma completa del nombre de host. La normalización de los nombres de Host mejora la eficacia del sistema porque permite utilizar la misma memoria caché JNDI para un host de programa de arranque determinado independientemente del formato de la referencia en el URL del proveedor. Por ejemplo, la normalización de los nombres de host permite utilizar la misma memoria caché de JNDI para las referencias a myhost, myhost.mydomain.com y localhost referencias si todas estas referencias se refieren al mismo host.
Dado que los nombres de host normalizados se almacenan en la memoria caché, las normalizaciones subsiguientes se ejecutan con más rapidez. En algunos entornos de red, los datos de la búsqueda de nombres de dominio cambia dinámicamente, haciendo que los datos de normalización de nombres de host almacenados en la memoria caché queden obsoletos. En estos entornos, puede que sea necesario inhabilitar la normalización de nombres de host. Cuando se inhabilita la normalización de hosts, los nombres de host y las direcciones IP se utilizan tal cual. Las referencias a localhost generalmente se resuelven a la dirección de bucle de retorno, 127.0.0.1.
Los clientes JNDI pueden inhabilitar la normalización de nombres de host estableciendo una propiedad. El valor de propiedad se aplica mediante la fábrica de contexto inicial cuando crea una instancia nueva de un objeto java.naming.InitialContext.
Utilice una de las técnicas siguientes para establecer esta propiedad:- Puede especificar el valor de serie desde una línea de comandos. Por ejemplo:
java -Dcom.ibm.websphere.naming.hostname.normalizer=...none...
- Puede crear un archivo denominado
jndi.properties como un archivo de texto con los
valores de propiedades deseados. Por ejemplo:
... com.ibm.websphere.naming.hostname.normalizer=...none... ...
Si utiliza esta técnica, tenga en cuenta que pueden existir otras instancias del archivo jndi.properties en la classpath, y pueden contener valores de propiedad que entren en conflicto. Los valores de propiedad vienen determinados por el orden en que el cargador de clases selecciona los archivos jndi.properties. No hay ningún modo de controlar el orden que utiliza el cargador de clases para localizar los archivos en la classpath. WebSphere Application Server no contiene inicialmente ni crea archivos jndi.properties que establezcan la propiedad com.ibm.websphere.naming.hostname.normalizer.
- Puede utilizar las constantes de Java PROPS.HOSTNAME_NORMALIZER* en un
programa Java. Estas constantes Java se definen en el archivo com.ibm.websphere.naming.PROPS. A continuación se muestran las definiciones de constantes que debe especificar si utiliza esta técnica:
public static final String HOSTNAME_NORMALIZER = "com.ibm.websphere.naming.hostname.normalizer"; public static final String HOSTNAME_NORMALIZER_NONE = "...none...;
Para utilizar estas definiciones en un programa Java, añada el valor de propiedad a una tabla hash y páselo al constructor InitialContext:
java.util.Hashtable env = new java.util.Hashtable(); ... env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE); // Inhabilitar la normalización de nombres de host ... javax.naming.Context initialContext = new javax.naming.InitialContext(env);
Ejemplo: Inhabilitación de la normalización de nombres de host
Puede pasar la propiedad de normalización de nombres de host al constructor InitialContext mediante el parámetro del constructor InitialContext en el archivo de propiedades del sistema o en un archivo jndi.properties. El contexto inicial y los contextos futuros en los que se realicen búsquedas desde ese contexto inicial utilizan este valor de propiedad.
En el ejemplo siguiente se muestra cómo inhabilitar la normalización de nombres de host.
... import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import com.ibm.websphere.naming.PROPS; // Constantes de nombres de WebSphere ... Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); env.put(Context.PROVIDER_URL, ...); env.put(PROPS.HOSTNAME_NORMALIZER, PROPS.HOSTNAME_NORMALIZER_NONE); Context initialContext = new InitialContext(env); java.lang.Object o = initialContext.lookup(...); ...
- Puede especificar el valor de serie desde una línea de comandos. Por ejemplo:
Subtopics
Ejemplo: obtención del contexto inicial por omisión
Hay varios modos de que un programa obtenga el contexto inicial por omisión.Ejemplo: obtención de un contexto inicial estableciendo la propiedad del URL de proveedor
Por lo general, los clientes JNDI (Java Naming and Directory Interface) pueden presuponer que el entorno correcto ya está configurado, por lo que no es necesario establecer de forma explícita los valores de propiedad y pasarlos al constructor InitialContext. No obstante, es posible que un cliente JNDI tenga que acceder a un espacio de nombres que no sea el identificado en su entorno. En este caso, es necesario establecer de forma explícita la propiedad java.naming.provider.url (el URL de proveedor) utilizado por el constructor InitialContext. Un URL de proveedor contiene información acerca del servidor de rutina de carga que la fábrica de contexto inicial puede utilizar para obtener un contexto inicial. Cualquier valor de propiedad que se pase directamente al constructor InitialContext tiene prioridad sobre los valores de las mismas propiedades encontradas en otro lugar del entorno.Ejemplo: establecimiento de la propiedad del URL de proveedor para seleccionar un contexto de raíz diferente al contexto inicial
Cada servidor contiene su propio contexto de raíz de servidor y, cuando se ejecuta la rutina de carga con un servidor, la raíz de servidor es el contexto JNDI inicial predeterminado. La mayor parte del tiempo, este valor predeterminado es el contexto inicial deseado, ya que los artefactos del sistema, como por ejemplo, las ubicaciones iniciales de EJB están enlazadas allí. No obstante, existen otros contextos de raíz que pueden contener enlaces de interés. Es posible especificar un URL de proveedor para seleccionar otros contextos de raíz.Ejemplo: búsqueda de una ubicación inicial o interfaz de empresa de EJB con JNDI
La mayoría de aplicaciones que utilizan JNDI (Java Naming and Directory Interface) se ejecutan en un contenedor. Algunas no. El nombre utilizado para buscar un objeto depende de si la aplicación se está ejecutando en un contenedor o no. A veces, resulta más cómodo que una aplicación utilice un URL de corbaname como nombre de búsqueda. Los clientes JNDI basados en contenedor y los clientes Java ligeros pueden utilizar un URL de corbaname.Consideraciones sobre la interoperatividad de JNDI
Debe tomar pasos adicionales para habilitar los programas de modo que interoperen con los clientes que no son del producto JNDI y enlazar los recursos de MQSeries a un espacio de nombres.Colocación en memoria caché de JNDI
Para aumentar el rendimiento de las operaciones JNDI (Java Naming and Directory Interface), la implementación del JNDI del producto utiliza la colocación en memoria caché para reducir el número de llamadas remotas al servidor de nombres para operaciones de búsqueda. En la mayoría de los casos, utilice el valor de memoria caché predeterminado.Valores de memoria caché de JNDI
A continuación se presentan varios valores de propiedades en memoria caché de JNDI (Java Naming and Directory Interface). Asegúrese de que todos los valores de propiedades son valores de serie.Consideraciones sobre las correlaciones de nombres de JNDI a CORBA
Los servidores de nombres de WebSphere Application Server son una implementación de la interfaz CosNaming de CORBA. El producto proporciona una implementación de JNDI (Java Naming and Directory Interface) que se puede utilizar para acceder a los servidores de nombres de CosNaming mediante la interfaz JNDI. La correlación de series de nombres JNDI a y desde nombres CORBA puede presentar algunos problemas.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tnam_develop_naming
File name: tnam_develop_naming.html