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.

Los ejemplos siguientes muestran cómo se realizan búsquedas JNDI desde tipos de aplicaciones diferentes.

Búsqueda de JNDI desde una aplicación que se ejecuta en un contenedor

Las aplicaciones que se ejecutan en un contenedor pueden utilizar los nombres de búsqueda java:. Los nombres de búsqueda de esta forma proporcionan un nivel de desvío tal que el nombre de búsqueda utilizado para buscar un objeto no depende del nombre del objeto, ya que se enlaza en el espacio de nombres del servidor de nombres. Los descriptores de despliegue para la aplicación proporcionan la correlación del nombre java: con el nombre de búsqueda del servidor. El contenedor establece el espacio de nombres java: según la información del descriptor de despliegue de forma que el nombre java: se correlaciona adecuadamente con el objeto correspondiente.

El siguiente ejemplo muestra la búsqueda de una interfaz de empresa remota EJB 3.0. El nombre de búsqueda de ubicación inicial real está determinado por el archivo de enlace ibm-ejb-jar-bnd.xml de la interfaz, si está presente, o por el nombre predeterminado asignado al contenedor EJB si no hay ningún archivo de enlace. Para obtener más información, consulte los temas sobre los enlaces predeterminados para interfaces de empresa y ubicaciones iniciales y sobre enlaces definidos por el usuario para ubicaciones iniciales e interfaces de empresa EJB.
//
Obtener el contexto inicial según se muestra en un ejemplo anterior.
...
// Buscar la interfaz de empresa utilizando el nombre JNDI.
try {
   java.lang.Object ejbBusIntf =
      initialContext.lookup(
         "java:comp/env/com/miempresa/contabilidad/Account");
   accountIntf =
      (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class);
}
   catch (NamingException e) { // Error al obtener la interfaz de empresa
   ...
}

El siguiente ejemplo muestra la búsqueda de una ubicación inicial de EJB 1.x o 2.x. Los descriptores de despliegue de la aplicación determinan el verdadero nombre inicial de la búsqueda. El enterprise bean (EJB) reside en un contenedor de EJB, que proporciona una interfaz entre el bean y el servidor de aplicaciones en el que reside.

// Obtener el contexto inicial según se muestra en un ejemplo anterior
...
// Buscar la interfaz de inicio utilizando el nombre JNDI
try {
   java.lang.Object ejbHome =
      initialContext.lookup(
         "java:comp/env/com/mycompany/accounting/AccountEJB");
   accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow(
      (org.omg.CORBA.Object) ejbHome, AccountHome.class);
}
   catch (NamingException e) { // Error al obtener la interfaz de inicio
   ...
}

Búsqueda de JNDI desde una aplicación que no se ejecuta en un contenedor

Las aplicaciones que no se ejecutan en un contenedor no pueden utilizar los nombres de búsqueda java: ya que es el contenedor el que configura el espacio de nombres java: para la aplicación. En vez de esto, una aplicación de este tipo debe buscar el objeto directamente desde el servidor de nombres. Cada servidor de aplicaciones tiene un servidor de nombres. Los artefactos del sistema, como por ejemplo, las ubicaciones iniciales de EJB se enlazan con relación al contexto de raíz de servidor en el servidor de nombres. Los distintos servidores de nombres se federan por medio de una estructura de espacio de nombres del sistema. El modo recomendado de buscar objetos en distintos servidores consiste en cualificar el nombre de modo que éste se resuelva desde cualquier contexto inicial de la célula. Si se utiliza un nombre relativo, el contexto inicial debe ser el mismo contexto de raíz de servidor bajo el que se enlaza el objeto. El formato del nombre calificado depende de si dicho nombre calificado es un nombre basado en la topología o un nombre fijo. A continuación, se muestran ejemplos de cada formato de nombre cualificado.

  • Nombres calificados basados en la topología

    Los nombres calificados basados en la topología recorren el espacio de nombres del sistema hasta el contexto de raíz de servidor bajo el que está enlazado el objeto de destino. Un nombre cualificado basado en la topología se resuelve desde cualquier contexto inicial de la célula.

    El nombre calificado basado en la topología depende de si el objeto reside en un servidor único o clúster de servidores. A continuación, se muestran ejemplos de cada búsqueda.

    Servidor único
    El siguiente ejemplo muestra la búsqueda de una interfaz de empresa EJB que se está ejecutando en un servidor único MiServidor, configurado en el nodo Nodo1.
    //
    Obtener el contexto inicial según se muestra en un ejemplo anterior.
    // Utilizando la forma del nombre de búsqueda siguiente, no importa qué
    // servidor de la célula se está utilizando para obtener el contexto inicial.
    ...
    // Buscar la interfaz de empresa utilizando el nombre JNDI
    try {
       java.lang.Object ejbBusIntf = initialContext.lookup(
          "cell/nodes/Nodo1/servers/MiServidor/com/miempresa/contabilidad/Account");
       accountIntf =
         (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class);
    }
    catch (NamingException e) { // Error al obtener la interfaz de empresa
       ...
    }

    El siguiente ejemplo muestra la búsqueda de una ubicación inicial de EJB que se está ejecutando en un servidor único MiServidor configurado en el nodo Nodo1.

    // Obtener el contexto inicial según se muestra en un ejemplo anterior 
    // Utilizando la forma del nombre de búsqueda siguiente, no importa qué
    // servidor de la célula se está utilizando para obtener el contexto inicial.
    ...
    // Buscar la interfaz de inicio utilizando el nombre JNDI
    try {
       java.lang.Object ejbHome = initialContext.lookup(
          "cell/nodes/Nodo1/servers/MiServidor/com/miempresa/contabilidad/AccountEJB");
       accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow(
          (org.omg.CORBA.Object) ejbHome, AccountHome.class);
    }
    catch (NamingException e) { // Error al obtener la interfaz de inicio
       ...
    }
    Clúster de servidores
    El siguiente ejemplo muestra la búsqueda de una interfaz de empresa EJB que se está ejecutando en el clúster MiClúster. El nombre se puede resolver si alguno de los miembros del clúster se está ejecutando.
    //
    Obtener el contexto inicial según se muestra en un ejemplo anterior.
    // Utilizando la forma del nombre de búsqueda siguiente, no importa qué
    // servidor de la célula se está utilizando para obtener el contexto inicial.
    ...
       // Buscar la interfaz de empresa utilizando el nombre JNDI
    try {
       java.lang.Object ejbBusIntf = initialContext.lookup(
          "cell/clusters/MiClúster/com/miempresa/contabilidad/Account");
       accountIntf =
         (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class);
    }
    catch (NamingException e) { // Error al obtener la interfaz de empresa
       ...
    }

    El siguiente ejemplo muestra la búsqueda de una ubicación inicial de EJB que se está ejecutando en el clúster MiClúster. El nombre se puede resolver si alguno de los miembros del clúster se está ejecutando.

    // Obtener el contexto inicial según se muestra en un ejemplo anterior 
    // Utilizando la forma del nombre de búsqueda siguiente, no importa qué
    // servidor de la célula se está utilizando para obtener el contexto inicial.
    ...
       // Buscar la interfaz de inicio utilizando el nombre JNDI
    try {
       java.lang.Object ejbHome = initialContext.lookup(
          "cell/clusters/MiClúster/com/miempresa/contabilidad/AccountEJB");
       accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow(
          (org.omg.CORBA.Object) ejbHome, AccountHome.class);
    }
    catch (NamingException e) { // Error al obtener la interfaz de inicio
       ...
    }
  • Nombres calificados fijos

    Si el objeto de destino tiene un nombre fijo con un ámbito de célula definido para el mismo, puede utilizar su formato cualificado en lugar del nombre cualificado basado en la topología. Aunque el nombre basado en la topología funcione, el nombre fijo no varía con la topología de la célula específica o con el desplazamiento del objeto de destino a un servidor distinto.

    A continuación se muestra una búsqueda de ejemplo de una interfaz de empresa EJB con un nombre fijo cualificado.
    //
    Obtener el contexto inicial según se muestra en un ejemplo anterior.
    // Utilizando la forma del nombre de búsqueda siguiente, no importa qué
    // servidor de la célula se está utilizando para obtener el contexto inicial.
    ...
    // Buscar la interfaz de empresa utilizando el nombre JNDI
    try {
       java.lang.Object ejbBusIntf = initialContext.lookup(
         "cell/persistente/com/miempresa/contabilidad/Account");
       accountIntf =
         (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class);
       }
    catch (NamingException e) { // Error al obtener la interfaz de empresa
    ... 
    
    }

    A continuación, se muestra un ejemplo de búsqueda con un nombre fijo cualificado.

    // Obtener el contexto inicial según se muestra en un ejemplo anterior 
    // Utilizando la forma del nombre de búsqueda siguiente, no importa qué
    // servidor de la célula se está utilizando para obtener el contexto inicial.
    ...
    // Buscar la interfaz de inicio utilizando el nombre JNDI
    try {
       java.lang.Object ejbHome = initialContext.lookup(
         "cell/persistente/com/miempresa/contabilidad/AccountEJB");
       accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow(
          (org.omg.CORBA.Object) ejbHome, AccountHome.class);
       }
    catch (NamingException e) { // Error al obtener la interfaz de inicio
    ...
    }

Búsqueda de JNDI con un URL de corbaname

Un corbaname puede ser útil como nombre de búsqueda en ocasiones. Si, por ejemplo, el objeto de destino no es miembro del espacio de nombres federado y no se puede localizar con un nombre calificado, un corbaname puede ser un modo cómodo de buscar el objeto.

A continuación se muestra una búsqueda de una interfaz de empresa EJB con un URL de corbaname.
//
Obtener el contexto inicial según se muestra en un ejemplo anterior. 
... 
// Buscar la interfaz de empresa utilizando un URL de corbaname. 
try { 
   java.lang.Object ejbBusIntf = initialContext.lookup(
      "corbaname:iiop:someHost:2809#com/miempresa/contabilidad/Account"); 
   accountIntf =
     (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class); 
} 
catch (NamingException e) { // Error al obtener la interfaz de empresa 
   ... 
} 

A continuación, se muestra una búsqueda con un URL de corbaname.

// Obtener el contexto inicial según se muestra en un ejemplo anterior
... 
// Buscar la interfaz de inicio utilizando un URL de corbaname 
try { 
   java.lang.Object ejbHome = initialContext.lookup(
      "corbaname:iiop:someHost:2809#com/miempresa/contabilidad/AccountEJB"); 
   accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( 
      (org.omg.CORBA.Object) ejbHome, AccountHome.class); 
} 
catch (NamingException e) { // Error al obtener la interfaz de inicio 
   ... 
} 

Icon that indicates the type of topic Reference topic



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