`
xm_king
  • 浏览: 392991 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Spring技术内幕读书笔...
浏览量:15414
社区版块
存档分类
最新评论

JNDI和Java RMI远程调用(一)

    博客分类:
  • JAVA
阅读更多

 

     对于 Java EE 开发来说, Java RMI JNDOI 是两个非常重要的特性。 RMI 提供了远程调用的特性,而 JNDI 为应用程序提供了命名和目录服务,对于没有开发过大型项目的人来说,这些概念可能很陌生,那么为什么 Java EE 需要 JNDI RMI 呢,这源于企业级开发的需要。分布式结构有以下几个企业级系统所必须的特性:

        1.          性能:企业级系统需要强大的性能,单靠一台服务器通常无法满足性能需要,所以需要多台服务器协同工作。

        2.          健壮性:冗余的服务器组成阵列,当某个服务器无法正常工作的时候,保证系统用户不受影响。

        3.          可维护性:各个部分独立分开来,维护自己的运行状态,提高整个系统的灵活性和可维护性。

正是由于这些原因,企业级系统采用了分布式的结构,将系统分为各个不同的组件,各个组件之间靠消息或远程调用等机制来通信。在这种情况下就需要提供两类机制来保证组件之间能顺利协同工作。

        a)          命名和目录机制:在分布式结构下,如何定位一个资源、一个对象就成为了非常重要的问题。打个比方,一个人若在一个团队里和伙伴协同工作,那么当他需要别人帮忙的时候,就需要知道如何去寻找他人,一个办法就是建立通讯录。同样的道理,如果对象 A 需要调用不再同一台服务器上的远程对象 B 提供的方法,那么对象 A 如何寻找对象 B 呢。这是也可以建立通讯录的机制, JNDI Java Nam Directory Interface Java 命名和地址接口)就可以扮演通讯录的角色。利用 JNDI 的目录机制就相当于在通讯薄中翻查某个人的联系信息,当然,要使用通讯薄查找,首先要建立通讯薄,把具体的联系方式记录在通讯薄上,这就是 JNDI 提供的命名服务,也就是将资源绑定到目录上的简称。

         b)         消息机制和远程调用机制:找到远程对象或者资源之后,可以发送消息来通信,也可以利用远程调用机制来直接调用远程对象的方法。前者属于一种松耦合的结构,双方仅仅通过消息作为媒介,不直接发生关系, JMS 实现了这种方式;而后者属于紧耦合的结构,也就是 RMI 方式, JavaRMI Java Remote Method Interface 的简称。为什么需要 RMI ?设想一下,当对象 A 找到远程对象 B 之后,需要调用 B 的方法,但是调用 B 的方法,和调用本地的方法不同,由于 B A 不在同一台服务器上(准确的说,不再同一台 JVM 中),就造成了很多的问题。

  l   如何传递参数? Java 的参数传递是传引用而非传值的,所以 A 不能将指向本机内存中的一个引用当做参数传递给 B

  l 当远程组件在不同平台、不同语言下运行的,又该如何与其进行通信。

     Java RMI 实现远程调用

从很早之前开始,分布式环境就需要在不同主机之间进行进程通信和方法调用, RPC 就是为了这个目的而产生的,它允许一个程序访问另一台机器上的另一个程序的方法。而 RMI RPC 的基础上更进一步, RPC 是远程访问程序方法,而 RMI 允许访问远程对象。所以和 RPC 相比,基于面向对象开发的 RMI 可以充分利用继承、封装和多态的面向对象开发的特点。

Java RMI Java 的远程调用方式,利用它可以开发出分布式的远程对象,这些远程对象生存在不同的虚拟机上,并利用 RMI 协议进行通信。基本的 Java RMI 采用的是 JRMP Java Remote Method Protocol ),这个协议帮助 Java 远程对象进行通信,但是不支持对其他平台的支持,特别是对流行的 CORBA 的支持 (CORBA 支持 IIOP) ,所以在 Java RMI 的基础上,人们建立了 Java RMI  - IIOP。

注意:远程是一个与实际位置无关的概念,一个远程对象可以和客户端在同一个机器上,也可以分别在网络上的两台机器上。

当然有了美好的愿望还不够,要实现 RMI 需要解决很多的问题。

         1)         数据格式的兼容问题。在两个通信的组件之间数据格式会出现不一致,比如整数类型在A组件上是用2个字节表示的,而在B组件上是用4个字节表示的,这样当一个整数类型的参数从A组件传到B组件的时候,就会发生数据格式不一致的现象。这在 JAVA 之外的很多语言来说,是一个非常棘手的问题,但是 Java 的通用数据格式就避免了这种情况的发生。

        2)         参数传递方式的选择,一般来说,程序设计有两种参数的传递方式:值传递( pass by value )和引用传递 (pass by reference) 传值是将数据做一次拷贝,将拷贝得到的数据副本作为参数进行传递。用这种方式,被调用的方法中修改的只是数据的副本,而不是数据本身,所以原数据没有作修改。引用传递是将数据的引用传递,任何修改都将作用到数据本身。在远程调用的情况下,两种方式都可以传递参数,但都有一些问题。 对于值传递问题,由于是传递副本,所以远程对象的方法无法改变数据本身。另一个问题是若要传递对象参数,则需要将对象序列化,当对象空间很大的时候,序列化会带来很大的开销。 传递一个本地数据的引用到远程组件之后,远程组件根据此应用在其本地找到数据。所以还需要一次远程调用,往回访问引用数据本身。在 JavaRMI 中对这两种方式都支持。

        3)         系统的不稳定性

      在只有一个 JVM 的情况下,如果此 JVM 崩溃了,那么所有运行在其之上的程序全都一起失效,不会产生一部分对象仍然存在而另一部分消失的情况。但是在远程调用的环境中,有多个 JVM 在同时进行,如果其中一台 JVM 崩溃了,那么在其中的远程对象也消失,如果其他 JVM 中的对象不知道这些远程对象已经消失了,那么他们就会继续试图和这些“幽灵”对象进行通信,并发生异常。另外,由于远程对象之间通过网络进行通信,当网络发生故障的时候,对象应该得到通知。这些情况在 JavaRMI 中都得到了很好的支持。

 

要理解对象之间如何远程调用首先需要了解 Stubs( 存根 ) Skeletons( 骨架 ) 的概念。假设有两个对象 A B B 是远程对象,提供方法供 A 调用,我们称 B 为服务器端,对象 A 是远程方法的调用方,我们称 A 为客户端。 JavaRMI 如何让 A 对象调用 B 的方法呢,实际上 JavaRMI 会在客户端模拟被调用的对象 B ,生成一个本地对象,这个本地对象就叫 Stub (存根),存根生存在客户端,但代表了远程对象,它接受 A 的方法调用,并将这些方法调用映射到远端实际 B 对象。对于对象 A 来说,由于有了存根的存在,远程调用形式看起来都和本地调用一致。

B 对象所在的服务器端,对应地存在 Skeleton( 骨架 ) skeleton 是远程对象的代理,负责从网络接受调用的请求。并且将这些调用转移给实现的对象,所以可以认为,远程调用实际是通过 stub skeleton 进行的。

客户端和服务器端都不直接和对方以及网络打交道,有了 stub skeleton ,开发者可以从这些工作中解脱出来。

了解了 stubs skeletons 之后,我们来看以下服务器端的远程对象。要使用远程对象首先要有一个远程接口。因为 RMI 调用的是远程接口。在面向对象设计中,一个基本的思想就是接口与实现相分离。接口定义了一个对象暴露给外界的信息。从一个用户来看,接口表示了这个用户能对这个对象进行的操作。而实现是程序内部的实际逻辑,是操作的具体过程,这一部分往往不需要暴露给外界。通过接口与实现的分离,开发者可以在不改变接口的情况下 ( 不改变用户的调用方式 ) ,改变程序方法的实现。

RMI 采用了同一思想,在 RMI 的远程调用中,客户端只能调用远程的接口。所以远程对象实现之前首先需要建立一个远程接口,此接口定义了这个远程对象对外提供的所有方法,同时此接口需要同时继承 java.rmi.Remote 接口,比如如下的代码:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloInterface extends Remote {

  public void sayHello(String from)throws RemoteException;

}

 

 

 

 

 

 


这里定义了一个接口 HelloInterface , 它继承了 Remote 接口,所以是一个远程接口。在接口 HelloInterface 中,自定义了 sayHello ()方法。这就是远程对象提供的方法。方法声明会抛出 RemoteException 异常,当网络不正常的情况出现的时候就会出现这个异常。开发者可以处理这个异常,决定当网络故障等情况出现时的程序行为。 (Java RMI 努力让网络变得透明,即远程调用和在本地调用形式上一致,但是同时开发者需要注意,网络问题是不可避免的。 )

定义了远程接口之后,就需要实现远程对象。远程对象实现了远程接口,提供具体功能的实现。要让一个对象成为一个远程对象,并且让远程宿主 ( 远程宿主:就是提供了对远程调用支持的容器,让它来控制远程对象。当远程接口被调用的时候,远程宿主自动调用远程对象的对应方法。 ) 可以调用它的方法,可以使用以下方式的任何一种:

继承 Javax.rmi.PortableRemoteObject 对象,这样当远程对象生成的时候,会自动调用 PortableRemoteObject 的构造函数,这个构造函数帮助对象可以被远程调用

手动将对象设置成远程对象。可能对象本身已经继承了某个基类,而无法继承 PortableRemoteObject, 这是需要手动将对象设置为远程对象:

javax.rmi.PortableRemoteObject.exportObject()

下面就是实现了 HelloInterface 接口的远程对象 HelloImpl

 

 

 

import java.rmi.RemoteException;

import javax.rmi.PortableRemoteObject;

public class HelloImpl extends PortableRemoteObject implements HelloInterface {

    protected HelloImpl() throws RemoteException {

       super();   }

    public void sayHello(String from)throws RemoteException {

       System.out.println("hello from"+from);

       System.out.flush();

    }

}

 

 

 

 


 

从上面的代码中,我们可以看到:

1)      HelloImpl 继承 PortableRemoteObject 而称为远程对象

2)      HelloImpl 实现 HelloInterface 远程接口

3)      HelloImpl 的构造函数调用基类构造函数,并且此构造函数会抛出 RemoteException 异常。

4)      HelloImpl 实现了 sayHello 方法。

在一个典型的远程对象的调用中,还需要有一个服务器端的应用来生成远程对象,并将其暴露给外界。同时还存在连接服务器端的客户端。接下来介绍调用远程对象时,如何传递参数。之前已经讲过,一般有两种传递参数的方式:值传递和引用传递。在 RMI-IIOP 中,对两种方式都支持。但实际上, RMI-IIOP 的参数传递是值传递的,引用传递是通过模拟的方式实现的。

Java RMI 的基本概念已经介绍完了,要使用远程对象,不仅要实现远程对象,换需要提供能够定位远程对象的机制,下面一节将要介绍 JNDI

分享到:
评论

相关推荐

    三种方式实现java远程调用(rmi),绝对可用

    三种方式实现java远程调用(rmi) 方式一:原始方式 方式二:spring 方式三:jndi 解压,放到myeclipse上可用

    从Java走向Java+EE+.rar

    第17章 JNDI和Java RMI远程调用 249 17.1 用Java RMI实现远程调用 250 17.2 利用JNDI定位资源 256 17.3 实例——分布式的HelloWorld 260 17.4 小结 264 第18章 Java消息服务 265 18.1 消息系统和JMS 265...

    Java相关技术(详细资料)

    一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。  4、Java IDL(Java Interface Definition Language) ...

    cobra-rmi-iiop:Cobra协议中的分布式对象范例和远程方法调用的示例

    RMI-IIOP (称为“ IIOP上的RMI”)表示Internet球间协议(IIOP)上的Java远程方法调用(RMI)接口,该接口向Java平台提供了通用对象请求代理体系结构(CORBA)分布式计算功能。 更多信息 : 建造 编译项目文件 转...

    吉林大学软件学院服务计算概论第二次作业

    注:JDK1.3版本或更低的版本支持java.rmi.Naming,JDK1.3以后将命名服务API整合到JNDI中,javax.naming.Context声明了注册、查找,以及注销对象的方法。 三、实验要求 (1) 对关键代码解释清楚; (2) 远程对象...

    JAVA面试题

    老师给的面试题 解释下面关于J2EE的名词 (1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在...(5)RMI:Remote Method Interface,远程方法调用

    基于J2EE的介绍

    •RMI/ IIOP(远程过程调用/因特网ORB间协议):友情链接本地Java的RPC机制,CORBA,并允许非Java系统访问EJB。 •XML技术(JAXP,SAAJ,JAX-RPC等):一个完整的技术套件操纵XML和构建基于标准的XML Web服务。 •...

    java 面试题 总结

    它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.3.1 开发远程调用的无状态 Session Bean 304 8.3.2 开发本地调用的无状态 Session Bean 311 8.4 发布Session Bean 314 8.4.1 打包EJB-JAR 315 8.4.2 Annotation与部署描述文件 315 8.5 开发有状态的Session Bean ...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    BlazeDS 为 Flex 提供了基于 AMF 二进制协议的远程调用支持,其作用相当于 Java 的 RMI。有了 BlazeDS,通过简单的配置,一个 Java 接口就可以作为服务暴露给 Flex,供其远程调用。 尽管现有的 EmployeeMgmt 应用...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    BlazeDS 为 Flex 提供了基于 AMF 二进制协议的远程调用支持,其作用相当于 Java 的 RMI。有了 BlazeDS,通过简单的配置,一个 Java 接口就可以作为服务暴露给 Flex,供其远程调用。 尽管现有的 EmployeeMgmt 应用...

    TeamWork-JLU_info_sys:五个同性恋者共同努力,创造出伟大的事物

    B服务器对甲服务器上的“类”进行远程调用和实现而不考虑网络方面的技术(用于大型企业分布式计算)JSF:的JavaWeb前端的一个框架,用于开发界面,某些在网络界面添加表格组件来替代html中的代码RMI :(远程方法...

    h_JAVA 2应用编程150例.rar

    实例57 远程方法调用 174 实例58 调用JINI方法 176 第5章 Java数据库编程 179 实例59 应用JDBC-ODBC桥 180 实例60 使用单独JDBC连接驱动程序 184 实例61 数据库基本操作 185 实例62 使用游标 189 实例63 使用事务 ...

    spring in action英文版

     6.3 使用Hessian和Burlap的远程调用  6.3.1 访问Hessian/Burlap服务  6.3.2 用Hessian或Burlap公开Bean的功能  6.4 使用HTTP invoker  6.4.1 通过HTTP访问服务  6.4.2 把Bean作为HTTP服务公开  ...

    java应用软件程序设计

    154 实例53 监控HTTP 155<br>实例54 收发电子邮件 156 实例55 一个简单的代理服务器 164 实例56 扫描网站信息 173 实例57 远程方法调用 174 实例58 调用JINI方法 176 第5章 Java数据库编程 179...

    JSP高级编程(全)

    4.2 远程方法调用RMI 技术 4.3 CORBA 技术 4.4 JNDI 技术 4.5 本章小结6 第二部分 JSP 技术和XML 技术 第5 章 XML 简介 5.1 XML 简介及其语法规则 5.2 DTD 的书写及实例 5.3 CSS 与XSL 及其实例 5.4 XHTML 简介 5.5 ...

    JSP高级编程          

    4.2 远程方法调用RMI 技术 4.3 CORBA 技术 4.4 JNDI 技术 4.5 本章小结6 第二部分 JSP 技术和XML 技术 第5 章 XML 简介 5.1 XML 简介及其语法规则 5.2 DTD 的书写及实例 目录 5.3 CSS 与XSL 及其实例 5.4 XHTML 简介...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

Global site tag (gtag.js) - Google Analytics