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

  1. 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");
  2. 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 (\\).

  3. 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(...);
    ...

Icon that indicates the type of topic Task topic



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