下午和莉莉讨论JNDI,感觉网上好多资料都写到太过于高深莫测了,具体了解了之后,发现JNDI的使用目的,最根本的就是java应用通过一个名字获取其他JVM中的数据。而在提供JNDI服务的服务端应用中,建立了一个类似键值对的形式,存储JNDI的名字和数据的绑定。这就类似于数据库的连接池,不必每次去连接数据库都重新建立一个连接,而是直接从连接池中获取已有连接拿来使用即可,节省了内存同时也优化了效率。
网上大多数文章都是在讨论J2EE中如何使用JNDI获取数据源,确实很方便,但是作为理解JNDI的实例,稍显麻烦,下面将通过一个RMI与JNDI的集成服务端和客户端简单分析下RMI的使用和JNDI的原理。
java version "1.7.0_40"
RMI服务端接口
package com.jxl.rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; public interface RmiSimple extends Remote { public String sayHello() throws RemoteException; }
RMI服务端接口的实现
package com.jxl.rmi.server; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class RmiSimpleImpl extends UnicastRemoteObject implements RmiSimple { private static final long serialVersionUID = 1L; protected RmiSimpleImpl() throws RemoteException { super(); } public String sayHello() throws RemoteException { return "hello lili!!"; } }
RMI服务的实现
package com.jxl.rmi.server; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class RmiJndiSever { public static void main(String[] args) { try { //注册RMI服务器端口 LocateRegistry.createRegistry(8080); //建立RMI服务端接口实现对象 RmiSimple server = new RmiSimpleImpl(); //设置JNDI属性 Properties properties = new Properties(); //RMI的JNDI工厂类 properties.setProperty(Context.INITIAL_CONTEXT_FACTORY , "com.sun.jndi.rmi.registry.RegistryContextFactory"); //RMI服务端的访问地址 properties.setProperty(Context.PROVIDER_URL, "rmi://localhost:8080"); //根据JNDI属性,创建上下文 InitialContext ctx = new InitialContext(properties); //将服务端接口实现对象与JNDI命名绑定,这个地方写的并不是很规范 //如果在J2EE开发中,规范的写法是,绑定的名字要以java:comp/env/开头 ctx.bind("RmiSimple", server); System.out.println("RMI与JNDI集成服务启动.等待客户端调用..."); } catch (RemoteException e) { e.printStackTrace(); } catch (NamingException e) { e.printStackTrace(); } } }
RMI客户端的实现,使用JNDI去查找并调用RMI方法
package com.jxl.rmi.client; import java.rmi.RemoteException; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import com.jxl.rmi.server.RmiSimple; public class JndiRmiClient { public static void main(String[] args) { //设置JNDI属性 Properties properties = new Properties(); //RMI的JNDI工厂类 properties.setProperty(Context.INITIAL_CONTEXT_FACTORY , "com.sun.jndi.rmi.registry.RegistryContextFactory"); //RMI服务端的访问地址 properties.setProperty(Context.PROVIDER_URL, "rmi://localhost:8080"); try { //根据JNDI属性,创建上下文 InitialContext ctx = new InitialContext(properties); //根据JNDI上下文,查找并获取到远程的RMI对象 RmiSimple remote = (RmiSimple) ctx.lookup("RmiSimple"); System.out.println(remote.sayHello()); } catch (NamingException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
服务端运行时,会建立一个监听,等待客户端的命令,运行结果:
RMI与JNDI集成服务启动.等待客户端调用...
客户端运行时,会成功调用到服务端的方法,并进行打印输出:
hello lili!!
以上如果有理解错误,请各位不吝批评指正!
参考:RMI 与 JNDI集成 http://bbs.csdn.net/topics/340060074
参考:对java:comp/env的研究 http://f543711700.iteye.com/blog/1173618
相关推荐
Java分布式处理技术RMI,JNDI,
RMI简单实例RMI简单实例RMI简单实例
rmi的详细例子,rmi的详细用法,一看就懂
rmi与spring整合实例
JavaEE5学习笔记02-JNDI与RMI.
没有使用过RMI的学者可以参考本资源的实例,比较适用于没有RMI基础的学者,使用分布式编程
spring 与rmi 的整合 1.首先编写接口 interface : 这里的接口要继承Remote, 它是一个标识接口 2.编写实现类 3.编写main方法用于启动 service 4 配置spring文件 编写客户端测试类
Java RMI实例
rmi-jndi-ldap-jrmp-jmx-jms rmi,jndi,ldap,jrmp,jmx,jms一些演示测试
RMI-IIOP Java 源码实例,附有BAT批处理命令,Java EJB初学者可参考学习,EJB的例子。
dwr实例操作+rmi实例操作 dwr实例操作+rmi实例操作
java rmi spring 使用实例,内涵服务端和客户端的源代码,测试可用。
JAVARMI远程方法调用简单实例.docx
使用java自带的rmi建立服务器与客户端通信的实例
创建客户端RMI调用服务端的应用程序。 启动服务端,再启动客户端,测试是否调用成功。 如果客户端和服务端不在同一台电脑上,则需要对刚才定义的服务类采用rmic 编译一个客户端的框架类_stub并拷贝到客户端的类...
用RMI实现了KEY文件的传输
RMI最简单的一个实例RMI最简单的一个实例RMI最简单的一个实例
RMI远程调用开发实例,必须打开防火墙。 必须要在jdk安装目录D:\Java\jdk1.7\jre\lib\security javaws.policy文件加上 grant { permission java.security.AllPermission "", ""; };
使用 Java RMI 构建一个分布式议程服务(agenda service)。不同的客户应能连接到这一共享的议程服务,并查询、添加和删除议程中的会晤(meeting)安排。服务程序应具备新用户注册、清除某一用户所有会晤安排等管理...