RMI与JNDI集成服务实例

标签: rmi jndi 服务 | 发表时间:2014-08-08 22:55 | 作者:lance2002
出处:http://www.iteye.com

     下午和莉莉讨论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

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [rmi jndi 服务] 推荐:

RMI与JNDI集成服务实例

- - 编程语言 - ITeye博客
     下午和莉莉讨论JNDI,感觉网上好多资料都写到太过于高深莫测了,具体了解了之后,发现JNDI的使用目的,最根本的就是java应用通过一个名字获取其他JVM中的数据. 而在提供JNDI服务的服务端应用中,建立了一个类似键值对的形式,存储JNDI的名字和数据的绑定. 这就类似于数据库的连接池,不必每次去连接数据库都重新建立一个连接,而是直接从连接池中获取已有连接拿来使用即可,节省了内存同时也优化了效率.

Spring Rmi配置

- - 企业架构 - ITeye博客
现在远程调用一般用RPC,webservice或者Rmi,而目前用的比较多的是webservice和Rmi. webservice和rmi的最主要的区别,rmi的客户端和服务端都必须是java,webservice没有这个限制,webservice是在http协议上传递xml文本文件. 与语言和平台无关,rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言.

Spring整合Rmi总结

- - CSDN博客架构设计推荐文章
服务端使用了org.springframework.remoting.rmi.RmiServiceExporter. RmiServiceExporter把任何Spring管理的Bean输出成一个RMI服务. 通过把Bean包装在一个适配器类中工作. 适配器类被绑定到RMI注册表中,并且将请求代理给服务类.

在Tomcat 6.0下用JNDI连接IBM MQ 6.0的配置方法

- - 行业应用 - ITeye博客
假设在IBM MQ中定义的队列管理器的名为QueueManager, 端口1414,CCSID 437 ,创建名为LQ1,LQ2的队列分别用于发送和接收消息, 服务器连接通道名为SVRCONN. 确保在项目的Classpath中导入了以下的jar包:. 如果需使用spring的JmsTemplate方式来读写MQ,还需要导入.

使用 RMI + ZooKeeper 实现远程调用框架

- - zzm
1.1 定义一个 RMI 接口. 1.2 编写 RMI 接口的实现类. 1.3 通过 JNDI 发布 RMI 服务. 4 使用 ZooKeeper 提供高可用的 RMI 服务. 在 Java 世界里,有一种技术可以实现“跨虚拟机”的调用,它就是 . RMI(Remote Method Invocation,远程方法调用).

分布式通信的几种方式(EJB、RMI、RPC、JMS、web service杂谈)

- - CSDN博客互联网推荐文章
RPC是远程过程调用协议,它是基于C/S模型调用的机制,客户机向服务器端发送调用请求等待服务器应答,是一种典型的请求应答机制,大致过程可以理解为本地分布式对象向本机发请求,不用自己编写底层通信本机会通过网络向服务器发送请求,服务器对象接受参数后,经过处理再把处理后的结果发送回客户端. 它是早期的支持分布式一些,缺点rpc是面向过程的远程调用,不支持面向对象,所以现在用的人就少了.

服务禁语

- tiancaicai - 白板报
前几天在一个公交汽车站拍到了一张规定,里面规定了服务禁语和礼貌用语,看了大乐. 3、乘车高峰车厢内拥挤时,禁语:“快往里走,站在前面又没有钞票检. ”文明语:“请尽量往里走,照顾没有上车的乘客”. 4、车子抛锚,禁语:“车子抛锚没有办法,人都要生毛病的,车子坏了也正常. ”文明语:“对不起,车子出现故障修一下,请大家理解.

服务熔断

- - CSDN博客推荐文章
服务熔断也称服务隔离,来自于Michael Nygard 的《Release It》中的CircuitBreaker应用模式,Martin Fowler在博文 CircuitBreaker中对此设计进行了比较详细说明. 本文认为服务熔断是服务降级的措施. 服务熔断对服务提供了proxy,防止服务不可能时,出现串联故障(cascading failure),导致雪崩效应.

面向服务与微服务架构

- - CSDN博客推荐文章
最近阅读了 Martin Fowler 和 James Lewis 合著的一篇文章  Microservices, 文中主要描述和探讨了最近流行起来的一种服务架构模式——微服务,和我最近几年工作的实践比较相关感觉深受启发. 本文吸收了部分原文观点,结合自身实践经验来探讨下服务架构模式的演化. 面向服务架构 SOA 思想概念的提出已不是什么新鲜事,大概在10年前就有不少相关书籍介绍过.

经理服务生

- netcasper - 坏脾气的小肥
2007年的时候,我和内容团队一起去报道上海车展,累得够呛,写稿子到凌晨一两点,早上八点钟又要爬起来去现场或更新早班. 有天上午,编辑都挤在大会议室里忙活着整理、发布、撰稿,而我搞完了竞品检查/数据分析/计划修订,一时间闲着,就打算去买些零食给大家. 环顾四周,没人有空,只好自己下楼,嘿咻嘿咻拎了两三百块钱的零食上来.