JNDI
一、 基本概念: rmi技术产生后,使远程对象的查找成为了技术焦点。JNDI技术产生后,就可方便的查找远程或者本地对象
JNDI是什么: The Java Naming and Directory Interface,java命名和目录接口,是一组在java应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI接口,能够通过名字定位用户、机器、网络、对象服务等
a. 命名服务: 就像DNS一样,通过命名服务器提供服务,大部分的J2EE服务器都含有命名服务器
b. 目录服务: 一种简化的RDBMS系统,通过目录具有的属性保存一些简单的信息JNDI的好处:
a. 包含大量命名和目录服务,可以使用相同的api调用访问任何命名或目录服务
b. 可以同时连接多个命名和目录服务
c. 允许把名称同java对象或资源关联起来,不必知道对象或资源的物理ID
d. 使用通用接口访问不同种类的目录服务
e. 使得开发人员能够集中使用和实现一种类型的命名或目录服务客户api上
二、 JNDI应用程序结构: JNDI结构由一个API和一个SPI组成
- JNDI上下文: javax.naming.Context。 命名服务是将名称与对象相关联,这种关联被称为绑定,一组这样的绑定称为上下文
- 初始化上下文: InitialContext是一个实现了Context接口的类。使用这个类作为命名服务的入口点
- 要通过JNDI进行资源访问时,必须设置初始化上下文的参数。主要是设置JNDI驱动的类型(java.naming.factory.initial)和提供命名服务的url(java.naming.provider.url)。因为JNDI的实现产品有很多,所以驱动的类名因提供JNDI服务器的不同而不同。url值包括提供命名服务的主机地址和端口号。
Rmi简单例子
1、 项目结构
2、 代码
注: 如果接口返回的数据类型是对象的话,则需要进行手动序列化 implements serializable
// com.distribute.RmiSample
package com.distribute;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RmiSample extends Remote{
public int sum(int a, int b) throws RemoteException;
}
// com.distribute.RmiSampleImpl
package com.distribute;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RmiSampleImpl extends UnicastRemoteObject implements RmiSample {
/**
*
*/
private static final long serialVersionUID = 1L;
public RmiSampleImpl() throws RemoteException {
super();
}
@Override
public int sum(int a, int b) throws RemoteException {
return a + b;
}
}
// com.distribute.RmiSampleClient
package com.distribute;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class RmiSampleClient {
public RmiSampleClient() throws MalformedURLException, RemoteException, NotBoundException {
String url = "//localhost:8808/sample";
RmiSample rmiObject = (RmiSample) Naming.lookup(url);
System.out.println("1 + 2 =" + rmiObject.sum(1, 2));
}
}
//com.distribute.RmiServer
package com.distribute;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class RmiServer {
public RmiServer() {
// 创建和安装一个安全管理器,令其支持RMI。作为Java开发包的一部分,适用于RMi唯一一个是RMISecurityManager
// if (System.getSecurityManager() == null) {
// System.setSecurityManager(new RMISecurityManager());
// }
try {
LocateRegistry.createRegistry(8808);
RmiSampleImpl server = new RmiSampleImpl();
Naming.rebind("//localhost:8808/sample", server);
System.out.println("Server is staring...");
} catch (RemoteException | MalformedURLException e) {
e.printStackTrace();
}
}
}
// com.distribute.jndi.RmiSampleClientJndi
package com.distribute.jndi;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.distribute.RmiSample;
public class RmiSampleClientJndi {
public RmiSampleClientJndi() {
try {
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:8808");
InitialContext context = new InitialContext();
RmiSample rmiObject = (RmiSample) context.lookup("java:com/distribute/RmiSampleImpl");
System.out.println("1 + 2 = " + rmiObject.sum(1, 2));
context.close();
} catch (RemoteException | NamingException e) {
e.printStackTrace();
}
}
}
//com.distribute.jndi.RmiSampleServerJndi
package com.distribute.jndi;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.distribute.RmiSampleImpl;
public class RmiSampleServerJndi {
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(8808);
RmiSampleImpl server = new RmiSampleImpl();
System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:8808");
InitialContext context = new InitialContext();
context.bind("java:com/distribute/RmiSampleImpl", server);
context.close();
System.out.println("Server is starting...");
} catch (RemoteException | NamingException e) {
e.printStackTrace();
}
}
}