Szukaj…


RMI przez JNDI

Ten przykład pokazuje, jak JNDI działa w RMI. Ma dwie role:

  • w celu zapewnienia serwerowi interfejsu API bind / unbind / rebind do rejestru RMI
  • w celu zapewnienia klientowi interfejsu API wyszukiwania / listy do rejestru RMI.

Rejestr RMI jest częścią RMI, a nie JNDI.

Aby to uprościć, użyjemy java.rmi.registry.CreateRegistry() do utworzenia rejestru RMI.

  1. Server.java (serwer JNDI)

    package com.neohope.jndi.test;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import java.io.IOException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.util.Hashtable;
    
    /**
     * JNDI Server
     * 1.create a registry on port 1234
     * 2.bind JNDI
     * 3.wait for connection
     * 4.clean up and end
     */
    public class Server {
        private static Registry registry;
        private static InitialContext ctx;
    
        public static void initJNDI() {
            try {
                registry = LocateRegistry.createRegistry(1234);
                final Hashtable jndiProperties = new Hashtable();
                jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
                jndiProperties.put(Context.PROVIDER_URL, "rmi://localhost:1234");
                ctx = new InitialContext(jndiProperties);
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    
        public static void bindJNDI(String name, Object obj) throws NamingException {
            ctx.bind(name, obj);
        }
    
        public static void unbindJNDI(String name) throws NamingException {
            ctx.unbind(name);
        }
    
        public static void unInitJNDI() throws NamingException {
            ctx.close();
        }
    
        public static void main(String[] args) throws NamingException, IOException {
            initJNDI();
            NMessage msg = new NMessage("Just A Message");
            bindJNDI("/neohope/jndi/test01", msg);
            System.in.read();
            unbindJNDI("/neohope/jndi/test01");
            unInitJNDI();
        }
    }
    
  2. Client.java (klient JNDI)

    package com.neohope.jndi.test;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import java.util.Hashtable;
    
    /**
     * 1.init context
     * 2.lookup registry for the service
     * 3.use the service
     * 4.end
     */
    public class Client {
        public static void main(String[] args) throws NamingException {
            final Hashtable jndiProperties = new Hashtable();
            jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
            jndiProperties.put(Context.PROVIDER_URL, "rmi://localhost:1234");
    
            InitialContext ctx = new InitialContext(jndiProperties);
            NMessage msg = (NeoMessage) ctx.lookup("/neohope/jndi/test01");
            System.out.println(msg.message);
            ctx.close();
        }
    }
    
  3. NMessage.java (klasa serwera RMI)

    package com.neohope.jndi.test;
    
    import java.io.Serializable;
    import java.rmi.Remote;
    
    /**
     * NMessage
     * RMI server class
     * must implements Remote and Serializable 
     */
    public class NMessage implements Remote, Serializable {
        public String message = "";
    
        public NMessage(String message)
        {
            this.message = message;
        }
    }
    

Jak uruchomić eaxmple:

  1. zbuduj i uruchom serwer
  2. zbuduj i uruchom klienta

Przedstawiać

Model JNDI

Java Naming and Directory Interface (JNDI) to Java API dla usługi katalogowej, która umożliwia klientom oprogramowania Java wykrywanie i wyszukiwanie danych i obiektów według nazwy. Został zaprojektowany w taki sposób, aby był niezależny od jakichkolwiek konkretnych nazw lub implementacji usług katalogowych.

Architektura JNDI składa się z API ( interfejs programowania aplikacji) i SPI (interfejs dostawcy usług). Aplikacje Java używają tego interfejsu API do uzyskiwania dostępu do różnych usług nazewnictwa i usług katalogowych. Interfejs SPI umożliwia przejrzyste podłączanie różnych usług nazewnictwa i usług katalogowych, umożliwiając aplikacji Java korzystającej z interfejsu API technologii JNDI dostęp do ich usług.

Jak widać na powyższym obrazku, JNDI obsługuje LDAP, DNS, NIS, NDS, RMI i CORBA. Oczywiście możesz to przedłużyć.

Jak to działa

W tym przykładzie Java RMI używa interfejsu API JNDI do wyszukiwania obiektów w sieci. Jeśli chcesz wyszukać obiekt, potrzebujesz co najmniej dwóch informacji:

  • Gdzie znaleźć przedmiot

Rejestr RMI zarządza powiązaniami nazw, informuje, gdzie znaleźć obiekt.

  • Nazwa obiektu

Jaka jest nazwa obiektu? Zwykle jest to ciąg znaków, może to być również obiekt implementujący interfejs Name.

Krok po kroku

  1. Najpierw potrzebujesz rejestru, który zarządza wiązaniem nazw. W tym przykładzie używamy java.rmi.registry.LocateRegistry .

    //This will start a registry on localhost, port 1234
    registry = LocateRegistry.createRegistry(1234);
    
  2. Zarówno klient, jak i serwer potrzebują kontekstu. Serwer używa kontekstu do powiązania nazwy i obiektu. Klient używa kontekstu, aby wyszukać nazwę i uzyskać obiekt.

    //We use com.sun.jndi.rmi.registry.RegistryContextFactory as the InitialContextFactory
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
    //the registry usrl is "rmi://localhost:1234"
    jndiProperties.put(Context.PROVIDER_URL, "rmi://localhost:1234");
    InitialContext ctx = new InitialContext(jndiProperties);
    
  3. Serwer wiąże nazwę i obiekt

    //The jndi name is "/neohope/jndi/test01"
    bindJNDI("/neohope/jndi/test01", msg);
    
  4. Klient wyszukuje obiekt o nazwie „/ neohope / jndi / test01”

    //look up the object by name "java:com/neohope/jndi/test01"
    NeoMessage msg = (NeoMessage) ctx.lookup("/neohope/jndi/test01");
    
  5. Teraz klient może korzystać z obiektu

  6. Kiedy serwer się kończy, musisz wyczyścić.

    ctx.unbind("/neohope/jndi/test01");
    ctx.close();
    


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow