rmi是什么意思(rmi医学检验指什么检查)

生活百科 2023-04-28 10:04生活百科www.xingbingw.cn

rmi是什么意思(rmi医学检验指什么检查),本文通过数据整理汇集了rmi是什么意思(rmi医学检验指什么检查)相关信息,下面一起看看。

RMI和CORBA经常被认为是相互竞争的技术,因为两者都提供了对远程分布式对象的透明访问。但这两种技术其实是互补的,一种的长处正好可以弥补另一种的短处。RMI和CORBA的结合产生了RMI-IIOP,它是企业服务器中Java开发的基础。在本文中,Java开发人员Damian Hagge简要介绍了RMI-IIOP,然后向您展示了如何构建和运行一个简单的、基于Java的RMI-IIOP客户机/服务器应用程序。请你自己看看马绍尔群岛在IIOP能做得多好。1997年,IBM和Sun Microsystems启动了一项合作计划,以推动Java作为企业开发技术的发展。这两家公司专注于如何使用Java作为服务器端语言,并生成可以集成到现有架构中的企业级代码。需要一种远程传输技术,既有Java的RMI(远程方法调用)的较少资源占用,又有CORBA(公共对象请求代理体系结构)技术的健壮性。正因如此,RMI-IIOP问世,帮助将Java语言推向了服务器端企业开发的主流语言的领先地位。

在本文中,我将简要介绍RMI-IIOP,目的是使您能够开始在企业开发解决方案中使用这项技术。为了解释RMI-IIOP到底是什么,我认为提供一些关于CORBA和RMI的信息是很重要的,这些信息可能在每种技术的典型介绍中找不到。如果你不熟悉CORBA或RMI的基础知识,我建议你在继续阅读之前先阅读一些介绍性的信息。请参考参考资料,其中选择了一些文章和教程。

在我详细讨论RMI-IIOP之前,我们将看看CORBA和RMI为请求编译数据所使用的机制。CORBA将是我们的主要例子,因为RMI-IIOP数据编译是基于CORBA传输协议(IIOP)的。我们将回顾传输协议和ORB(对象请求代理)在发送请求、定位远程对象和在网络上传输对象方面的基本功能。

通过使用IIOP协议实现远程对象传输的CORBA请求的数据编译。简而言之,IIOP将任何以标准化格式构建的IDL(接口定义语言)元素表示为一系列字节。让我们假设一个Java客户机正在向C服务器发送一个CORBA请求。客户端应用程序引用Java接口形式的远程对象,并调用该接口的操作。本质上,接口调用其相应的操作实现,该实现将位于存根中(存根是您将使用idlj从IDL生成的)。

将存根方法调用分派给ORB,ORB由两部分组成客户端ORB和服务器ORB。客户端ORB的职责是编译请求的数据,将其放在网络上并发送到特定的位置。服务器ORB的职责是监听从网络上传的请求,并将这些请求转换成语言实现可以理解的方法调用。关于CORBA ORB角色的更深入的讨论,请参考参考资料部分。

在存根调度方法调用之后,客户机ORB将请求和所有参数转换成标准化的字节格式,在本例中是IIOP。接下来,请求通过网络发送到服务器ORB,服务器ORB应该监听传入的请求。服务器端ORB将读取数据字节,并将请求转换成对C服务器实现有意义的内容。C server方法将执行其功能(即调用请求的方法)并使用相同的机制通过IIOP将结果返回给客户端。

RMI以类似的方式处理请求,它使用JRMP (Java远程消息传递协议)作为它的传输协议。,RMI传输还涉及到Java对象的序列化。

CORBA运行在IIOP协议上;马绍尔群岛使用JRMP。CORBA是独立于语言的;RMI是纯Java对Java。RMI使用JNDI来定位远程对象;使用CORBA CosNaming。RMI序列化对象;CORBA不是。远程对象定位CORBA使用CosNaming命名服务来定位远程对象。CosNaming为名称服务器提供了一个框架来存储对CORBA服务器进程的绑定(或引用)。当CORBA客户机向名称服务发送CosNaming请求,请求具有给定名称的服务器进程时,名称服务返回该进程的互操作对象引用(IOR)。然后,客户机使用这个IOR直接与服务器进程通信。

IOR包含关于服务器进程的信息,比如它的位置。CosNaming服务的一个缺点是,IOR对于人类来说是很难理解的——至少对于我们这些没有电子大脑的人来说是这样。相反,RMI是用户友好的。它使用运行在JNDI上的注册表(非常类似于命名服务)来定位远程对象。RMI registry使用Java引用对象(由几个RefAddr对象组成)来识别和定位远程对象。这些Java对象比IOR更加用户友好。

不久前,COBRA将互操作命名服务(INS)集成到了它的对象定位模型中。在INS CosNaming上运行,使用人类可读的URL作为其对象位置。INS不使用命名服务;相反,它将调用直接发送到指定的URL。有关INS的更多信息,请参见参考资料。

RMI vs. CORBA那么,CORBA和RMI哪个更好呢?答案取决于你想做什么。CORBA是一个运行在行业标准的第三代或第四代协议上的大体系结构,并且已经过测试。如果考虑CORBA提供的所有附件(比如事务处理、安全拦截器、事件通道等等),CORBA似乎是企业应用程序的解决方案。CORBA最大的缺点是复杂。为了熟练使用CORBA,开发人员通常必须经历一个陡峭的训练曲线。

相反,RMI相当容易学。创建客户机/服务器实现、绑定到注册表和远程对象,以及使用RMI来调用和/或接收请求是非常简单的。RMI占用的资源也比CORBA少得多,因为JRMP是一种开销比IIOP少得多的协议。,RMI缺少CORBA的工业级附件,它是一种纯粹基于Java的机制。所以,我们真正需要的是RMI的灵活性和易用性以及CORBA的企业就绪性,对吗?然后开始讨论RMI-IIOP。

RMI-IIOP既有CORBA的优点,又有RMI的灵活性。开发人员可以很容易地使用RMI-IIOP,RMI-IIOP可以很容易地集成到大多数企业基础设施。RMI-IIOP RMI-IIOP概述允许你在IIOP上运行RMI调用,只需最小的修改。使用RMI-IIOP,您可以编写简单易懂的Java代码,使用CORBA提供的丰富的企业功能套件。,代码足够灵活,可以在RMI或IIOP上运行。这意味着您的代码可以在纯Java环境中运行(当少量的资源消耗和灵活性非常重要时),或者只需稍加修改就可以集成到现有的CORBA基础设施中。

RMI-IIOP的强大功能之一是,它允许您编写纯Java客户机/服务器实现,而不会失去RMI类序列化的灵活性。RMI-IIOP通过覆盖Java序列化并将Java类转换为网络上的IIOP来实现这一点。在另一端,Java类作为IIOP从网络中被读取,然后这个类的一个新实例被创建(使用反射)。该类所有成员的值都是完整的——看这是IIOP上的Java序列化!

为了让RMI-IIOP实现透明的对象定位,ORB供应商历史上一直使用Java CosNaming服务提供者(或者通俗点说就是插件)。这个插件在JNDI API下工作,并访问CORBA命名服务。虽然我在这里没有花篇幅解释原因,这个命名方案并不理想。,许多供应商,尤其是应用服务器供应商,已经为RMI-IIOP开发了特殊的对象定位机制。

RMI-IIOP也支持INS作为Java CosNaming服务的扩展。因为我相信INS将决定物体定位的未来方向,所以本文中我们将要讨论的代码示例使用INS。

注意本文提供的源代码在Sun JDK上是不能用的,因为Sun还没有完全遵守OMG INS标准,也没有公开org.omg.CORBA.ORB接口的register_initial_reference。您需要IBM Developer Kit for Java Technology,版本1.3.1或更高版本。,我已经使用命名服务创建了一个与Sun兼容的示例,您可以从参考资料部分下载它。

关于自己构建RMI-IIOP已经说得够多了,让我们来写代码吧!在下面几节中,我们将构建一个简单的、基于Java的客户机/服务器RMI-IIOP应用程序。这个应用程序由三部分组成RMI接口、服务器应用程序和客户端应用程序。该示例在IIOP的基础上实现了Java序列化,您可以看到Java类是如何由客户机实例化、传递给服务器、由服务器更改,然后所有修改都完全返回给客户机的。

第1部分定义接口在RMI-IIOP下,我们可以选择使用RMI或者IDL来定义接口。因为我们想看看RMI如何在IIOP上运行,所以我们将使用RMI来定义示例接口。清单1是我们简单示例的RMI接口

1.RMIInterface.java

/ 远程接口/公共接口RMIInterface扩展java.rmi.Remote {公共字符串hello()抛出Java . RMI . Remote exception;公共ser class alter class(ser class class object)抛出Java . RMI . remote exception;}RMIInterface定义了一个hello()方法和一个alterClass(SerClass)方法。后一种方法以SerClass为参数,SerClass是一个实现Serializable的Java类,alterClass(SerClass)方法返回一个与其参数类型相同的类。类是一个简单的类,有几个成员,每个成员都有一个对应的getter方法。这些方法如清单2所示

2.SerClass.java/ 该类旨在通过RMI-iiop进行序列化。/public class serclass实现Java . io . serializable {//members private int x;私有字符串myString//构造函数public SerClass(int x,String myString)抛出Java . RMI . remote exception { this . x=x;this.myString=myString} //某些访问器方法public int getX(){ return x;} public void setX(int x){ this . x=x;} public String getString(){ return myString;} public void setString(String str){ myString=str;}}这就是我们简单界面的意义所在。现在让我们来学习服务器类。

第2部分构建服务器我们将使用一个服务器类(Server.java ),它既是RMIInterface实现类,又是main方法(启动我们的服务)。从Server.java继承javax.rmi.PortableRemoteObject。这样,它包含了将自己作为远程接口绑定到ORB并开始监听请求所需的所有函数。清单3是这个服务器的代码

清单3.Server.java/ 简单服务器/导入Java。util。;导入Java。RMI。远程;导入Java。RMI。远程异常;导入javax。RMI。portableremoteobject导入javax。RMI。CORBA。领带;导入javax。RMI。CORBA。util导入org。OMG。便携式服务器。poa导入org。OMG。便携式服务器。;导入org。OMG。便携式服务器。仆人;导入org。OMG。CORBA。orb公共类服务器扩展PortableRemoteObject实现RMIInterface { //必须显式创建默认构造函数//才能抛出远程异常公共服务器()抛出远程异常{ }//RMI接口方法的实现公共字符串你好()抛出远程异常{返回“你好!”;} public ser class alter class(ser class class class object)抛出RemoteException { //更改ser类别的值并返回. X//类对象。setx(类对象。getx()5)加5;//更改字符串类对象。setstring(类对象。getstring()':我把你改了');返回类对象;} public static void main(String[]args){ try {//创建球传入端口监听Properties props=new Properties();道具。放(' com。IBM。CORBA。侦听器端口',' 8080 ');ORB orb=ORB.init(args,props);//实例化服务器//这样会自动调用导出对象(this)Server s=new Server();//现在获取我们的服务器对象的存根- //这将是//一个远程接口和一个org。OMG。CORBA。object Remote r=portable Remote object。tostub(s);//将进程注册到可以找到它的名称//((com。IBM。CORBA。iiop。圆形)圆形)下register _ initial _ reference(' OurLittleClient ',(org。OMG。CORBA。object)r);系统。出去。println(' Hello服务器正在等待. ');//就是这么简单——//我们已经注册并监听传入的请求宝珠。run();} catch(Exception e){ e . printstacktrace();} }}呃,这里发生着什么呢?服务器应用程序的代码很长,那我们就分开来讲吧。,如前面提到过的,服务器类实现无线电磁指示器(Radio Magnetic Indicator的缩写)接口并为它的所有方法提供实现。您可以在代码的前面部分看到无线电磁指示器(Radio Magnetic Indicator的缩写)接口的你好()方法和交替类方法的实现你好()方法只是返回字符串你好。交替类方法用SerClass对象作参数,修改成员的值,然后返回新的对象— 全都通过IIOP马绍尔群岛共和国.

Server.java的主要的方法初始化一个球体.这个球将设置为8080 的com.ibm.CORBA.ListenerPort属性作为参数传入。这将使得球在端口8080 上侦听传入请求。请注意,com.ibm.CORBA.ListenerPort是一个专有的国际商用机器公司属性。如果您想在另一供应商的球上运行这些代码,那您应该参阅该供应商的文档,找到适当的属性(孙使用com。星期日CORBA。poa。orbpersistentserverport,但它只在您使用早教(便携式对象适配器,可移植对象适配器)伺服器(仆人)时才能够工作。)

初始化球后,主要方法接着对计算机网络服务器对象进行实例化。因为这个计算机网络服务器对象也是一个PortableRemoteObject所以缺省构造函数会自动调用exportObject(this)。这个对象现在已经就绪于接收远程调用。

接着,我们需要通过调用宝珠。register _ initial _ reference(String,orb.omg.CORBA.Object)注册这个对象。为此,我们需要把我们的计算机网络服务器对象作为org.omg.CORBA。对象的引用。调用PortableRemoteObject.toStub实现了这一点,因为所返回的对象都实现了java.rmi。远程和org.omg.CORBA.Object。

然后,返回的org.omg.CORBA。对象对象向服务器端球注册为我们的小客户.为了确保移民归化局请求能够定位对象,我们使用注册调用注册_初始_参考.当移民归化局调用进入球时,球体将查找已经以正在被请求的名称注册的对象。由于我们将对象注册为我们的小客户,所以,当一个移民归化局调用进入我们的服务器球要求我们的小客户时,我们将知道客户机正在查找的是哪个对象。

,我相信你已经注意到了,我们把ORB强行转换成com.ibm.CORBA.iiop.ORB是因为Sun还没有公开org.omg.CORBA.ORB接口的register_initial_reference,IBM SDK也不能公开。所以一定要强行把我们的ORB改造成IBM ORB。随着Sun变得越来越符合OMG,JDK的未来版本(1.4.0之后)可能不需要这种强制转换。

就是这样!很简单,不是吗——嗯,有点。我们的服务器正在等待传入的客户端INS请求。客户呢?

第3部分构建客户端应用程序的代码如清单4所示

清单4。Client.java/ 客户端应用/import javax . RMI . portableremoteobject;导入org . OMG . CORBA . orb;public class Client { public static void main(String[]args){ try { ORB ORB=ORB . init(args,null);//下面是本地主机字符串INSUrl=' corbaloc:iiop:1.2 @ localhost:8080/OurLittleClient '的URL//获取对远程进程org . OMG . CORBA . object objRef=orb . string _ to _ object(INSUrl)的引用;//缩小到我们的RMI interface RMI interface ri=(RMI interface)portableremoteobject . narrow(objRef,RMI interface . class);//调用hello方法System.out.println('从服务器接收' ri . hello()' \ n ');//尝试RMI序列化SerClass se=new SerClass(5,'客户端字符串!');//在服务器上传递要更改的类//在后台这个类是//通过IIOP se=ri.alterClass(se)序列化的;//现在来看结果System.out.println('序列化结果\ n ' ' Integer was 5 now is ' se . getx()' \ n ' ' String was ' Client String!现在是' ' se . getstring()' ');} catch(Exception e){ e . printstacktrace();}}}如何分解客户端代码。客户端代码比服务器代码简单。我们初始化一个ORB,然后调用string_to_object(string),其中String是我们的INS URL。构建INS URL非常简单,我们指定使用corbaloc URL(参见参考资料)和IIOP协议版本1.2。接下来,我们添加主机名(www.whatever.com)和要连接的端口。,我们指定我们正在寻找的服务的名称。得到的INS URL是CORBA loc:iiop:1.2 @ localhost:8080/ourlittleclient。

当我们将这个URL传递给ORB.string_to_object(String)时,ORB会向指定的服务器分派一个请求,请求所请求的服务。假设一切正常,ORB将接收回服务的对象引用(实际上是IOR)。然后,我们将对象引用缩小到我们可以使用的东西,即RMIInterface,这样我们就可以开始调用方法了。

调用简单的hello方法(应该不需要任何解释)之后,我们就可以开始探索RMI-IIOP的序列化功能了。,我们创建一个SerClass,一个可序列化的Java类,并初始化它的成员变量。接下来,我们将该类传递到我们的方法中,该方法通过IIOP将该类写出到服务器。服务器读入该类,将其重新创建为服务器端Java对象,修改其成员值,然后将其作为方法的返回值返回(使用IIOP)。当我们收到远程方法调用后重新创建的对象时,我们看到它的成员确实已经被服务器修改了。就这么简单IIOP上的Java序列化。

第4部分运行示例请注意,我们在这里创建的示例必须在IBM Developer Kit for Java Technology 1 . 3 . 1或更高版本中运行。如果您喜欢使用Sun JDK,请下载特定于Sun的源代码,并且应该在Sun 1.4.0 JDK或更高版本中运行它。该源代码包括一个readme.txt文件,该文件解释了IBM SDK版本和Sun JDK版本之间的差异。如果您没有IBM Developer Kit for Java Technology(并且您想要一个),请现在下载一个;他们是自由的。

以下是运行该示例的步骤

下载源文件。输入javac 。java,所有javac文件。在服务器类rmic -iiop Server上运行rmic(带有IIOP标志)。启动服务器在Windows中,请输入启动java服务器。启动客户端在Windows中,请输入启动java客户端。关于RMI-IIOP和EJB组件的说明EJB 2.0规范规定EJB组件必须能够在RMI和RMI-IIOP上运行。RMI-IIOP作为EJB组件的在线协议的加入,为J2EE环境与现有企业基础设施(大部分是CORBA密集型的)的集成带来了巨大的帮助。但也引发了一些问题。

简单地说,将定制组件与EJB组件集成需要您(开发人员)处理管道,否则在EJB架构中它们对您来说将是抽象的。到目前为止,这个问题没有简单的解决方案,可能永远也不会有。随着Web服务等技术的发展,可能会出现一个解决方案,但现在还不知道。

结论之后怎么办?我希望这篇文章向您展示了构建和运行RMI-IIOP客户机/服务器应用程序是多么容易。您可以修改我们用来用纯CORBA替换客户机或服务器的例子,这样做会从您的应用程序中删除Java序列化。

如果想在CORBA环境下使用RMI-IIOP,值得看看IDL如何映射到Java,Java如何映射到IDL。如果你想在一个不安全的环境(即不是你自己的PC)中部署RMI-IIOP,那么研究CORBA安全功能(如拦截器和CORBA安全模型)和其他CORBA企业功能(如事务处理)是一个不错的主意。运行RMI-IIOP时,可以使用CORBA的所有丰富特性。

参考数据

下载本文的IBM兼容源代码。下载本文与Sun兼容的源代码。IIOP协议是由对象管理组织(OMG)制定的,它也制定和维护CORBA规范。要了解更多关于CORBA的知识,请访问OMG的CORBA网站。要了解更多关于RMI的信息,请访问RMI主页。Java开发者连接提供了一个INS教程,里面也对命名服务、CosNaming服务和corbaloc URL格式进行了大致介绍。想探索您的Java技术选择吗?请参阅IBM developer kit for Java技术的完整列表。要了解关于IBM Developer Kit for Java Technology 1.3版和RMI-IIOP的更多信息,请参考javax.rmi.CORBA类层次结构。要进一步了解RMI和CORBA编程,请学习RMI、CORBA和分布式对象(developerworks,2000年10月)。如果您是使用EJB组件编程的新手,您可能需要学习教程Enterprise JavaBean s Foundations(developer works,2001年3月)。要了解更多关于EJB技术和CORBA之间的关系,请参考Ken Nordby的《部署和使用Enterprise JavaBeans组件——第3部分》,这是对EJB技术的介绍,由三部分组成(developerWorks,2000年6月)。RMI-IIOP的首席设计师RMIover IIOP写了一篇关于JavaWorld的文章,描述了他对这项技术的看法(JavaWorld,1999年12月)。要全面了解theServerSide.com-IIOP马绍尔群岛共和国,请参考文章“RMI/IIOP在,不错的想法,但事实证明是不同的”,这集中在什么是RMI-IIOP没有提供的(TheServerside.com)。这个网站是个人知识管理的网络存储空间。所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请一键举报。

更多rmi是什么意思(rmi医学检验指什么检查)相关信息请关注本站,本文仅仅做为展示!

Copyright@2015-2025 www.xingbingw.cn 性病网版板所有