下午和莉莉讨论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
相关推荐
Spring框架作为Java企业级应用的基石,它提供了与RMI集成的能力,使得开发者可以方便地利用RMI来构建高可扩展性的系统。本文将深入探讨Spring整合RMI的相关知识点。 首先,理解RMI的基本概念是关键。RMI允许一个...
6. **JNDI与LDAP集成**: JNDI也可以与LDAP服务器进行交互。开发者可以使用JNDI API来执行搜索、添加、删除和修改LDAP目录中的条目。 总的来说,JNDI是Java开发中一个强大的工具,它提供了对各种命名和目录服务的...
总的来说,Spring集成RMI提供了一种简单、可管理的方式来创建和使用分布式服务。通过Spring的配置,我们可以轻松地在客户端和服务器之间建立连接,实现远程方法调用,提高应用的可扩展性和灵活性。理解并熟练运用...
2. **目录服务集成**:JNDI支持多种不同的目录服务协议,如LDAP,开发者可以通过统一的API来操作不同的目录服务,而无需关心底层实现细节。 3. **层次结构**:JNDI中的命名是基于树状层次结构的,这使得数据的组织...
这意味着JNDI可以与 LDAP、DNS、RMI 等多种服务无缝集成。 5. **应用示例**:在企业级Java应用中,JNDI 常用于管理数据源,通过 JNDI 查找数据库连接池,从而实现数据库连接的透明管理。此外,还可以用来查找 EJB ...
RMI(Remote Method Invocation,远程方法调用)是Java平台上的一个重要特性,它允许...不过,实际应用中,还应关注RMI与其他技术(如EJB、JMS、JNDI等)的集成,以及现代Java框架(如Spring)中对RMI的支持和扩展。
**RMI与Azure服务的集成** 1. **Azure虚拟机**:可以在虚拟机上部署RMI服务器,通过开放合适的端口和配置网络安全规则,使外部可以访问RMI服务。 2. **Azure App Service**:虽然App Service不直接支持RMI,但可以...
- `org.springframework.jndi`: 用于JNDI(Java Naming and Directory Interface)操作,RMI服务通常会在JNDI注册表中注册。这个包中的工具类可以帮助我们查找和绑定RMI服务。 配置Spring RMI的基本步骤如下: 1. ...
此外,还提到了如何将RMI与CORBA(Common Object Request Broker Architecture)集成起来,以实现更广泛的服务互操作性。 #### 实战案例分析 为了帮助读者更好地理解Java RMI的实际应用场景,本书提供了多个实战...
JNDI通过目录服务(如LDAP)或命名服务(如RMI注册表)提供服务。 2. **EJB与JNDI的结合**: 在EJB中,JNDI主要用于查找EJB的引用。客户端首先通过JNDI查找EJB的Home接口,然后通过Home接口创建远程或本地的...
- **JNDI和命名服务**:RMI可以与Java Naming and Directory Interface (JNDI)集成,提供更复杂的服务发现功能。 - **安全性**:RMI支持SSL/TLS加密和认证,以确保通信安全。 5. **示例代码解析** - 服务器端...
实例117 C/S结构的RMI-IIOP应用 414 实例118 使用JTA与JTS 417 实例119 Request-Reply模式的JMS应用 421 实例120 使用Java IDL 426 实例121 EJB与CORBA的交互 430 实例122 基于EJB的真实世界模型 433 实例123 EJB的...
### 如何在JBoss上同时启动两个实例 在企业级应用服务器JBoss中,有时我们需要在同一台物理机器上运行多个独立的JBoss实例。这在测试环境或开发环境中非常常见,...希望本文能帮助你在JBoss中实现多实例的配置与管理。
它可能会涵盖常见问题,如处理异常、优化性能、使用RMI-IIOP(RMI over IIOP,一种在CORBA基础设施上运行RMI的方式)以及与Java Naming and Directory Interface (JNDI)的集成。 总的来说,RMI是Java平台上的一个...
`javax.naming.Context` 是 JNDI(Java Naming and Directory Interface)的一部分,从 JDK 1.3 开始,RMI 的命名服务被集成到了 JNDI 中,`Context` 类提供了更高级的命名和目录服务,可以用来注册、查找和注销对象...
这些服务确保EJB组件能够以声明式的方式集成到复杂的分布式环境中。 7. **调用原理**:客户端通常通过EJB的远程接口进行调用。调用过程涉及了远程方法调用(RMI,Remote Method Invocation)、EJB容器的拦截器...
- **远程调用**:通过RMI-IIOP或JNDI查找并调用EJB。 - **集成测试**:使用JUnit或Arquillian等工具进行EJB的单元测试和集成测试。 通过实践这些J2EE EJB编程实例,开发者可以更深入地了解EJB的工作原理和使用...
397 实例113 使用B/S结构的EJB 402 实例114 使用C/S结构的EJB组件服务 405 实例115 与时间有关的函数 407 实例116 EJB与UML的对应关系 412 实例117 C/S结构的RMI-IIOP应用 414 实例118 使用JTA与...
系统分析员考试复习主要涉及了多个IT领域的知识点,包括JavaBean、Enterprise JavaBean(EJB)、JSP、企业计算的基本服务、J2EE组件、RMI与RPC的区别、XML与HTML的区别以及XML与JSP的集成。以下是这些知识点的详细...