Java Language
JNDI
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.
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(); } }
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(); } }
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:
- zbuduj i uruchom serwer
- zbuduj i uruchom klienta
Przedstawiać
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
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);
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);
Serwer wiąże nazwę i obiekt
//The jndi name is "/neohope/jndi/test01" bindJNDI("/neohope/jndi/test01", msg);
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");
Teraz klient może korzystać z obiektu
Kiedy serwer się kończy, musisz wyczyścić.
ctx.unbind("/neohope/jndi/test01"); ctx.close();