Beispiel: EJB-Home- oder -Geschäftsschnittstelle mit JNDI suchen

Die meisten Anwendungen, die Java™ Naming and Directory Interface (JNDI) verwenden, werden in einem Container ausgeführt. Bei manchen Anwendungen ist das nicht der Fall. Welcher Name zum Lokalisieren eines Objekts verwendet wird, hängt davon ab, ob die Anwendung in einem Container ausgeführt wird. Manchmal ist es für eine Anwendung besser, einen corbaname-URL als Lookup-Namen zu verwenden. Containerstützte JNDI-Clients und Thin-Java-Clients können einen corbaname-URL verwenden.

Die folgenden Beispiele zeigen, wie JNDI-Lookup-Operationen in unterschiedlichen Typen von Anwendungen ausgeführt werden.

JNDI-Lookup über eine Anwendung, die einem Container ausgeführt wird

Anwendungen, die in einem Container ausgeführt werden, können java:-Lookup-Namen verwenden. Lookup-Namen mit diesem Format bieten eine Zwischenstufe, damit der Lookup-Name, der zum Lokalisieren eines Objekts verwendet wird, nicht vom Objektnamen, wie im Namespace des Namensservers gebunden, abhängig ist. Die Implementierungsdeskriptoren für die Anwendung ermöglichen die Zuordnung über den java:-Namen und den Lookup-Namen des Namensservers. Der Container definiert den java:-Namespace basierend auf den Implementierungsdeskriptorinformationen, damit der java:-Name dem entsprechenden Objekt ordnungsgemäß zugordnet werden kann.

Das folgende Beispiel veranschaulicht eine Lookup-Operation für eine ferne Geschäftsschnittstelle von EJB 3.0. Der tatsächliche Home-Lookup-Name wird von der Bindungsdatei ibm-ejb-jar-bnd.xml der Schnittstelle bestimmt, falls vorhanden, oder vom Standardnamen, der vom EJB-Container zugeordnet wird, wenn keine Bindungsdatei vorhanden ist. Weitere Informationen finden Sie in den Artikeln zu den Standardbindungen für Geschäftsschnittstellen und -Home-Schnittstellen sowie zu den benutzerdefinierten Bindungen für EJB-Geschäftsschnittstellen und -Home-Schnittstellen.
// Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
...
// Die Geschäftsschnittstelle mit dem JNDI-Namen lokalisieren.
try  { 
   java.lang.Object ejbBusIntf =
      initialContext.lookup(
         "java:comp/env/com/mycompany/accounting/Account");
   accountIntf =
      (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class); 
}
   catch (NamingException e) { // Fehler beim Abrufen der Geschäftsschnittstelle
   ...
}

Das folgende Beispiel veranschaulicht die Suche einer Home-Schnittstelle der EJB Version 1.x oder Version 2.x. Der tatsächliche Home-Lookup-Name wird von den Anwendungsimplementierungsdeskriptoren festgelegt. Die Enterprise-Bean (EJB) befindet sich in einem EJB-Container, der eine Schnittstelle zwischen der Bean und dem zugehörigen Anwendungsserver darstellt.

// Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
...
// Die Home-Schnittstelle mit dem JNDI-Namen lokalisieren
try  { 
   java.lang.Object ejbHome =  
      initialContext.lookup(
         "java:comp/env/com/meinecompany/accounting/AccountEJB");
   accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( 
      (org.omg.CORBA.Object) ejbHome, AccountHome.class); 
}
   catch (NamingException e) { // Fehler beim Abrufen der Home-Schnittstelle
   ...
}

JNDI-Lookup-Operationen über eine Anwendung, die nicht in einem Container ausgeführt wird

Anwendungen, die nicht in einem Container ausgeführt werden, können java:-Lookup-Namen nicht verwenden, da der Container den java:-Namespace für die Anwendung konfiguriert. Stattdessen muss eine Anwendung dieses Typs das Objekt direkt über den Namensserver lokalisieren. Jeder Anwendungsserver enthält einen Namensserver. Systemartefakte, wie z. B. die EJB-Home-Schnittstellen, werden relativ zum Serverstammkontext dieses Namensservers gebunden. Die verschiedenen Namensserver werden durch eine Struktur des System-Namespace eingebunden. Es wird empfohlen, zum Lokalisieren von Objekten auf verschiedenen Servern den Namen zu qualifizieren, damit der Name über jeden Ausgangskontext in der Zelle aufgelöst werden kann. Wird ein relativer Name verwendet, muss der Ausgangskontext mit dem Serverstammkontext, unter dem das Objekt gebunden ist, identisch sein. Das Format des qualifizierten Namens ist davon abhängig, ob der qualifizierte Name auf einer Topologie basiert oder ein fester Name ist. Es folgen Beispiele für die verschiedenen Formen des qualifizierten Namens.

  • Topologiebasierte Namen

    Topologiebasierte qualifizierte Namen gehen durch den System-Namespace zum Serverstammkontext, unter dem das Zielobjekt gebunden ist. Ein topologiebasierter qualifizierter Name wird über jeden Ausgangskontext in der Zelle aufgelöst.

    Ein topologiebasierter qualifizierter Name ist davon abhängig, ob das Objekt sich auf einem Einzelserver oder in einem Server-Cluster befindet. Es folgen Beispiele für die verschiedenen Lookup-Operationen.

    Einzelserver
    Das folgende Beispiel veranschaulicht die Lookup-Operation für eine EJB-Geschäftsschnittstelle, die im Einzelserver MyServer ausgeführt und auf dem Knoten Node1 konfiguriert wird.
    // Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
    // Nachfolgendes Format für Lookup-Namen verwenden, unabhängig davon, welcher
    // Server in der Zelle zum Abrufen des Ausgangskontextes verwendet wird.
    ...
    // Die Geschäftsschnittstelle mit dem JNDI-Namen lokalisieren.
    try  { 
       java.lang.Object ejbBusIntf = initialContext.lookup(
          "cell/nodes/Node1/servers/MyServer/com/mycompany/accounting/Account");
       accountIntf =
         (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class); 
    }
    catch (NamingException e) { // Fehler beim Abrufen der Geschäftsschnittstelle
       ...
    }

    Das folgende Beispiel veranschaulicht die Lookup-Operation für eine EJB-Home-Schnittstelle, die im Einzelserver MeinServer ausgeführt und auf dem Knoten Node1 konfiguriert wird.

       // Ausgangskontext wie oben dargestellt abrufen 
    // Nachfolgendes Format für Lookup-Namen verwenden, unabhängig davon, welcher
    // Server in der Zelle zum Abrufen des Ausgangskontextes verwendet wird.
    ...
    // Die Home-Schnittstelle mit dem JNDI-Namen lokalisieren
    try  { 
       java.lang.Object ejbHome = initialContext.lookup(
          "cell/nodes/Node1/servers/MeinServer/com/meinecompany/accounting/AccountEJB");
       accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( 
          (org.omg.CORBA.Object) ejbHome, AccountHome.class); 
    }
    catch (NamingException e) { // Fehler beim Abrufen der Home-Schnittstelle
       ...
    }
    Server-Cluster
    Das folgende Beispiel veranschaulicht die Lookup-Operation für eine EJB-Geschäftsschnittstelle, die im Cluster "MyCluster" ausgeführt wird. Der Name kann aufgelöst werden, wenn eines der Cluster-Member ausgeführt wird.
    // Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
    // Nachfolgendes Format für Lookup-Namen verwenden, unabhängig davon, welcher
    // Server in der Zelle zum Abrufen des Ausgangskontextes verwendet wird.
    ...
       // Die Geschäftsschnittstelle mit dem JNDI-Namen lokalisieren.
    try  { 
       java.lang.Object ejbBusIntf = initialContext.lookup(
          "cell/clusters/MyCluster/com/mycompany/accounting/Account");
       accountIntf =
         (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class); 
    }
    catch (NamingException e) { // Fehler beim Abrufen der Geschäftsschnittstelle
       ...
    }

    Das folgende Beispiel veranschaulicht die Lookup-Operation für eine EJB-Home-Schnittstelle, die im Cluster "MyCluster" ausgeführt wird. Der Name kann aufgelöst werden, wenn eines der Cluster-Member ausgeführt wird.

       // Ausgangskontext wie oben dargestellt abrufen 
    // Nachfolgendes Format für Lookup-Namen verwenden, unabhängig davon, welcher
    // Server in der Zelle zum Abrufen des Ausgangskontextes verwendet wird.
    ...
       // Die Home-Schnittstelle mit dem JNDI-Namen lokalisieren
    try  { 
       java.lang.Object ejbHome = initialContext.lookup(
          "cell/clusters/MeinCluster/com/meinecompany/accounting/AccountEJB");
       accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( 
          (org.omg.CORBA.Object) ejbHome, AccountHome.class); 
    }
    catch (NamingException e) { // Fehler beim Abrufen der Home-Schnittstelle
       ...
    }
  • Feste qualifizierte Namen

    Wenn für das Zielobjekt ein für die Zelle gültiger fester Name definiert wurde, können Sie dessen qualifizierte Form anstelle des topologiebasierten qualifizierten Namens verwenden. Obwohl der topologiebasierte Name funktioniert, wird der feste Name durch die spezifische Zellentopologie oder durch die Verschiebung des Zielobjekts zu einem anderen Server nicht geändert.

    Es folgt ein Beispiel-Lookup für eine EJB-Geschäftsschnittstelle mit einem qualifizierten festen Namen.
    // Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
    // Nachfolgendes Format für Lookup-Namen verwenden, unabhängig davon, welcher
    // Server in der Zelle zum Abrufen des Ausgangskontextes verwendet wird.
    ...
    // Die Geschäftsschnittstelle mit dem JNDI-Namen lokalisieren.
    try  { 
       java.lang.Object ejbBusIntf = initialContext.lookup(
         "cell/persistent/com/mycompany/accounting/Account");
       accountIntf =
         (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class); 
       }
    catch (NamingException e) { // Fehler beim Abrufen der Geschäftsschnittstelle
    ... 
    
    }

    Es folgt ein Beispiel für einen Lookup mit einem qualifizierten festen Namen:

       // Ausgangskontext wie oben dargestellt abrufen 
    // Nachfolgendes Format für Lookup-Namen verwenden, unabhängig davon, welcher
    // Server in der Zelle zum Abrufen des Ausgangskontextes verwendet wird.
    ...
    // Die Home-Schnittstelle mit dem JNDI-Namen lokalisieren
    try  { 
       java.lang.Object ejbHome = initialContext.lookup(
         "cell/persistent/com/meinecompany/accounting/AccountEJB");
       accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( 
          (org.omg.CORBA.Object) ejbHome, AccountHome.class); 
       }
    catch (NamingException e) { // Fehler beim Abrufen der Home-Schnittstelle
    ...
    }

JNDI-Lookup mit einem corbaname-URL

Ein Corba-Name kann als Lookup-Name gelegentlich nützlich sein. Wenn z. B. das Zielobjekt nicht Member des eingebundenen Namespace ist und nicht mit einem qualifizierten Namen lokalisiert werden kann, kann das Objekt mit einem Corba-Namen einfach lokalisiert werden.

Es folgt ein Lookup für eine EJB-Geschäftsschnittstelle mit einem corbaname-URL.
// Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
... 
// Die Geschäftsschnittstelle mit einem corbaname-URL lokalisieren.
try  { 
   java.lang.Object ejbBusIntf = initialContext.lookup(
      "corbaname:iiop:someHost:2809#com/mycompany/accounting/Account"); 
   accountIntf =
     (Account)javax.rmi.PortableRemoteObject.narrow(ejbBusIntf, Account.class); 
} 
catch (NamingException e) { // Fehler beim Abrufen der Geschäftsschnittstelle
   ... 
} 

Es folgt ein Lookup mit einem corbaname-URL.

// Ausgangskontext wie in obigem Beispiel dargestellt abrufen.
... 
// Die Home-Schnittstelle mit einem corbaname-URL lokalisieren
try  { 
   java.lang.Object ejbHome = initialContext.lookup(
      "corbaname:iiop:someHost:2809#com/meinecompany/accounting/AccountEJB");
   accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( 
      (org.omg.CORBA.Object) ejbHome, AccountHome.class); 
} 
catch (NamingException e) { // Fehler beim Abrufen der Home-Schnittstelle
   ... 
} 

Symbol, das den Typ des Artikels anzeigt. Referenzartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rnam_example_prop3
Dateiname:rnam_example_prop3.html