programmera.net -> java -> normal     för utskrift      info@programmera.net

JNDI

1. Vad är JNDI?
2. Termer och definitioner
3. Tjänsteleverantörer
4. Hur används JNDI?
5. URLer som JNDI-namn

1. Vad är JNDI?

JNDI (Java Naming and Directory Interface) består av:

  1. API: Ett API som används av Javaapplikationer (alltså du) för att använda namntjänster och registertjänster.
  2. SPI: Ett SPI (Service Provider Interface) som möjligjör att olika leverantörer av namntjänster och registertjänster transparant kan koppla in sig.
Följande bild illustrerar arkitekturen för JNDI:



Bilden visar hur olika namn- och registertjänster anropas via samma API.

2. Termer och definitioner

Nedan definieras några termer som kan vara bra att känna till:

  • Namn (Name): En referens till ett objekt.
  • Bindning (Binding): Association mellan ett namn och ett objekt.
  • Kontext (Context): En mängd bindningar (mellan namn och objekt).
  • Initial Kontext (Initial Context): Startkontexten för namnoperationer.
  • Namntjänst (Naming Service): Med vilken man kan binda namn till objekt och sedan hitta ett objekt utifrån dess namn.
  • Registertjänst (Directory Service): En hirarkisk samling av namngivna objekt.
  • JNDI Tjänsteleverantör (JNDI Service Provider): För att komma åt en viss typ av namntjänst eller registertjänst måste du ha en "JNDI Tjänsteleverantör" som kopplas in under JNDI APIet.

3. Tjänsteleverantörer

JNDI packades med Java SE från och med version 1.3 och är sedan dess en del av Java SE. Java SE 1.3 inkluderar dessutom "JNDI tjänsteleverantörer" för följande protokoll:

  • LDAP
  • CORBA
  • RMI: Kom ihåg att även EJB går över RMI.
Vill du ha tillgång till någon annan tjänsteleverantör kan du ladda hem den från  http://java.sun.com/products/jndi/serviceproviders.html .

4. Hur används JNDI?

Man använder klasserna i paketet javax.naming för att utnyttja JNDI. Nedan visas ett exempel på hur JNDI kan användas för att hitta i det egna filträdet:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;

class HelloJNDI {
    public static void main(String[] args) {
        // Check that user has supplied name of file to lookup
        if (args.length != 1) {
            System.err.println("usage: java HelloJNDI filename");
            System.exit(-1);
        }

        String name = args[0];

        // Identify service provider to use
        Hashtable env = new Hashtable(20);
        env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.fscontext.RefFSContextFactory");

        try {
            // Create the initial context
            Context ctx = new InitialContext(env);

            // Look up an object
            Object obj = ctx.lookup(name);

            // Print it out
            System.out.println(name + " is bound to: " + obj);

            // Close the context when we're done
            ctx.close();
        } catch (NamingException e) {
            System.err.println("Problem looking up " + name + ": " + e);
        }
    }
}
Det argument som skickas med när man startar programmet är den sökväg (till en fil/mapp på hårddisken) som man alltså slår upp med JNDI. Nedan visas ett exempel på hur det kan se ut när man slår upp en EJB:

      try {
            InitialContext ctx = new InitialContext();
            User _user = (User) ctx.lookup("GnomeShop/UserBean/local");
      } catch (NamingException e) {
            e.printStackTrace ();
      }
Som ni ser används lookup()-metoden i båda fall.

5. URLer som JNDI-namn

Olika namnstandarder används beroende på vad som ska letas upp, se följande lista:

  • java:comp/env/jdbc/Banks: Uppslag för en datakälla som hanteras via JDBC. Här visar "java:comp/env/jdbc" att vi rör oss i namnutrymmet för JDBC.
  • java:comp/env/ejb/UserBean: Uppslag för en EJB vid namn UserBean. Här betyder "java:comp/env/ejb" att vi ska slå upp en EJB.
  • rmi://host:port/ObjectName: Syntax för RMI-uppslag, host defaultas till "localhost" och port till "1099".
  • ldap://home:port/attr1=value,attr2=value: Syntax för LDAP-uppslag.
Ofta behöver man inte skriva hela namnet, den första delen defaultas ofta.