Java Language
JNDI
Поиск…
RMI через JNDI
В этом примере показано, как JNDI работает в RMI. Он имеет две роли:
- для предоставления серверу API-интерфейса bind / unbind / rebind в реестре RMI
- для предоставления клиенту API поиска / списка в реестре RMI.
Реестр RMI является частью RMI, а не JNDI.
Чтобы сделать это простым, мы будем использовать java.rmi.registry.CreateRegistry()
для создания реестра RMI.
Server.java (сервер 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 (клиент 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 (класс сервера 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; } }
Как запустить eaxmple:
- создавать и запускать сервер
- создавать и запускать клиент
Вводить
Интерфейс именования и каталогов Java (JNDI) - это Java API для службы каталогов, которая позволяет клиентам программного обеспечения Java обнаруживать и искать данные и объекты через имя. Он разработан, чтобы быть независимым от какой-либо конкретной реализации именования или службы каталогов.
Архитектура JNDI состоит из интерфейса API (Application Programming Interface) и SPI (интерфейс поставщика услуг). Приложения Java используют этот API для доступа к различным службам именования и каталогов. SPI позволяет подключать различные службы имен и каталогов прозрачно, позволяя Java-приложению использовать API технологии JNDI для доступа к своим службам.
Как видно из рисунка выше, JNDI поддерживает LDAP, DNS, NIS, NDS, RMI и CORBA. Конечно, вы можете продлить его.
Как это устроено
В этом примере Java RMI использует JNDI API для поиска объектов в сети. Если вы хотите найти объект, вам нужно как минимум две части информации:
- Где найти объект
Реестр RMI управляет привязками имен, он сообщает вам, где найти объект.
- Имя объекта
Что такое имя объекта? Обычно это строка, она также может быть объектом, который реализует интерфейс Name.
Шаг за шагом
Сначала вам нужен реестр, который управляет привязкой имени. В этом примере мы используем
java.rmi.registry.LocateRegistry
.//This will start a registry on localhost, port 1234 registry = LocateRegistry.createRegistry(1234);
И клиенту, и серверу нужен Контекст. Сервер использует контекст для привязки имени и объекта. Клиент использует контекст для поиска имени и получения объекта.
//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);
Сервер связывает имя и объект
//The jndi name is "/neohope/jndi/test01" bindJNDI("/neohope/jndi/test01", msg);
Клиент ищет объект по названию "/ neohope / jndi / test01"
//look up the object by name "java:com/neohope/jndi/test01" NeoMessage msg = (NeoMessage) ctx.lookup("/neohope/jndi/test01");
Теперь клиент может использовать объект
Когда сервер заканчивается, его необходимо очистить.
ctx.unbind("/neohope/jndi/test01"); ctx.close();