JNDI服务模型

1、服务端
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;
/**
* Created by Hansen on 2016/5/4.
*/
public class Server {
private static InitialContext ctx;
public static void initJNDI() {
try {
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 unInitJNDI() throws NamingException {
ctx.close();
}
public static void main(String[] args) throws NamingException, IOException {
initJNDI();
NeoMessage msg = new NeoMessage("Just A Message");
bindJNDI("java:com/neohope/jndi/test01", msg);
System.in.read();
unInitJNDI();
}
}
2、客户端
package com.neohope.jndi.test;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
/**
* Created by Hansen
*/
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);
NeoMessage msg = (NeoMessage) ctx.lookup("java:com/neohope/jndi/test01");
System.out.println(msg.message);
ctx.close();
}
}
3、NeoMessage
package com.neohope.jndi.test;
import java.io.Serializable;
import java.rmi.Remote;
/**
* Created by Hansen
*/
public class NeoMessage implements Remote, Serializable {
public String message = "";
public NeoMessage(String message)
{
this.message = message;
}
}
大家可以看出,在这个简单的例子中:
1、服务端仅仅是把数据生成好,放到了LocateRegistry中。
2、而客户端,通过JNDI查到消息,获取到了对应的数据。
3、LocateRegistry完成了跨JVM/主机通讯的任务
反过来思考一下,对于JNDIL是不是更清楚一些了呢?
那再思考一下,那J2EE容器中的数据源是如何统一管理的呢?

