版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java分布式处理技术(RMI,JDNI)1.1 RMI的基本概念1.1.1什么是RMIRMI(Remote Method Invocation)远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。1.1.2RMI的用途1、分布式体系结构我们为什么要使用分布式计算呢?当我们想与多个用户或客户机共享一个中央资源(如一个数据库)时,就会使用分布式计算。分布式计算用来利用多个系统的组合计算能力,以便比在单个系统上更有效或更快地解决问题。可以用多种方法配
2、置多个计算机系统以共享处理,包括共享内存、共享磁盘或只是共享一条公共通信通道。最新的技术允许物理上相隔很远的系统能够在处理计算问题时协同工作。关于利用计算能力这一主题,因特网及伴随的通信协议TCP/IP的 出现已使无数的计算机系统史无前例地连接起来。对一些应用程序来说,能够利用如此多的计算功能来解决问题是令人满意的。甚至更吸引人的是,大多数计算机系 统都有充足的空闲时间,可以帮助解决其它问题。将来,网格计算会利用分布式计算能力进行出售,这与电力行业出售电能非常相似。2、Java分布式对象编程技术RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。只要
3、按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。1.1.3RMI应用程序分类依据RMI应用程序各部分职责,可对应用程序进行如下分类:服务器程序:服务器程序将创建多个远程对象,并使每个对象能够被引用。等待客户端调用创建好的远程对象上的方法。客户端程序:从服务端程序中得到一个或多个远程对象的引用。客户端能用此引用调用远程对象上的方法。对等计算程序:双方地位相等,互为对方的服务器和客户端。1.2创建RMI应用程序步骤1、定义远程接口在Java中,远程对象是实现远程接口的
4、类的实例,远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。远程接口具有如下特点:远程接口必须为public属性。如果不这样,除非客户端与远程接口在同一个包内,否则当试图装入实现该远程接口的远程对象时,调用会得到错误结果。远程接口必须扩展接口java.rmi.Remote。除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException。(或RemoteException的父类)。代码范例1package com.itjob;import
5、 java.rmi.*;public interface RmiSample extends Remotepublic int sum(int a,int b) throws RemoteException;2、实现远程接口远程对象实现类必须扩展远程对象java.rmi.UnicastRemoteObject类, 并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法,但客户只能使用远程接口中的方 法。因为客户是指向接口的一个句柄,而不是它的哪个类。必须为远程对象定义构造函数,即使只准备定义一个默认构造函数,用它调用基础类构造函数。因为
6、基础 类构造函数可能会抛出java.rmi.RemoteException,所以即使别无它用必须抛出java.rmi.RemoteException例外。代码范例2package com.itjob.rmi;import java.rmi.*;import java.rmi.server.*;import com.itjob.RmiSample ;/*远程接口实现类,继承了UnicastRemoteObject并实现了RmiSample远程接口*/public class RmiSampleImpl extends UnicastRemoteObject implements RmiSampl
7、e/覆盖默认构造函数并抛出RemoteExceptionpublic RmiSampleImpl() throws RemoteExceptionsuper();/所有远程实现方法必须抛出RemoteExceptionpublic int sum(int a,int b) throws RemoteExceptionreturn a+b;3、编写服务器类包含main方法的类可以是实现类自身,也可以完全是另一个类。下面通过RmiSampleServer来创建一个远程对象的实例,并通过java.rmi.registry.LocateRegistry类的createRegistry方法从指定端口号启
8、动注册服务程序,也可以通过执行rmiregistry命令启动注册服务程序,注册服务程序的缺省运行端口为1099。代码范例3package com.itjob.rmi;import java.rmi.*;import java.rmi.registry.*;public class RmiSampleServerpublic static void main(String args)/*创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分*适用于RMI唯一一个是RMISecurityManager.*if(System.getSecurityManager() = null) S
9、ystem.setSecurityManager(new RMISecurityManager();*/tryLocateRegistry.createRegistry(8808);RmiSampleImpl server=new RmiSampleImpl();Naming.rebind(/localhost:8808/SAMPLE-SERVER,server);System.out.println (远程对象注册成功,RMI服务已经启动,等待客户端调用.);catch(.MalformedURLException me)System.out.println (Malformed URL:+
10、me.toString();catch(RemoteException re)System.out.println (Remote exception:+re.toString();catch(AlreadyBoundException abe)System.out.println (AlreadyBoundexception:+abe.toString();代码范例3中将将远程对象名字绑定到对远程对象的引用上:LocateRegistry.createRegistry(8808);指定本RMI服务程序不使用默认端口1099,而是使用自己指定的端口8808。Naming.rebind(/loc
11、alhost:8808/SAMPLE-SERVER , Server);将远程对象在服务器上注册并指定了将查找远程对象引用的URL,URL格式为/host:port/name。其中host是注册表所在的主机(远程或本地),port是注册表接受调用的端口号,name是未经注册表解释的简单字符串。host和port两者都是可选项。如果省略了host,则主机默认为本地主机。如果省略了port,则端口默认为1099,该端口是RMI的注册表rmiregistry使用的“著名”端口。代码范例3的运行结果如图所示:图14.1代码范例3运行结果4、编写使用远程服务的客户机类客户机类的主要功能有两个,一是通过N
12、aming.lookup方法来构造注册服务程序stub程序实例,二是调用服务器远程对象上的远程方法。代码范例4package com.itjob.rmi;import java.rmi.*;import java.rmi.server.*;public class RmiSampleClient public static void main(String args)try String url = /localhost:8808/SAMPLE-SERVER;RmiSample RmiObject = (RmiSample)Naming.lookup(url);System.out.print
13、ln( 1 + 2 = + RmiObject.sum(1,2) ); catch (RemoteException exc) System.out.println(Error in lookup: + exc.toString(); catch (.MalformedURLException exc) System.out.println(Malformed URL: + exc.toString(); catch (java.rmi.NotBoundException exc) System.out.println(NotBound: + exc.toString();5、为远程对象实现创
14、建根和干客户端是通过Naming.lookup方法来构造注册服务程序stub程序实例,通过该实例的引用来发起对远程对象方法调用的,所以在运行运行客户端应用前必须为远程对象实现创建根(stub)和干(Skeleton)。要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行rmic编译器。存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法。在命令行模块下运行RMIC调用:图14.2RMIC命令调用RMIC命令运行结果如图所示:图14.3 RMIC运行结果我们可以看系统帮我们生成了存根(stub)Rmi
15、SampleImpl_Stub.class但系统并没有帮我们生成骨架(Skeleton)RmiSampleImpl_Skeleton.class。这与JDK的版本有关:采用JDK1.4版本运行rmic com.itjob.rmi. RmiSampleImpl命令系统将会生成存根(stub)RmiSampleImpl_Stub.class和骨架(Skeleton)RmiSampleImpl_Skeleton.class两个类文件;采用JDK1.5版本运行rmic com.itjob.rmi. RmiSampleImpl命令系统将只会生成存根(stub)RmiSampleImpl_Stub.cla
16、ss,骨架(Skeleton)RmiSampleImpl_Skeleton.class的功能将通反射技术由系统在运行时自动实现;6、运行程序依次做完上述步骤后,我们现在来运行一下我们的RMI应用。先运行服务端程序,运行结果如图14.1所示。接下来我们运行客户端程序(代码范例4),运行结果如图所示:图14.4客户端程序运行结果看到上面结果说明我们客户端程序进行RMI远程调用已经成功了。1.3 RMI接口和类简介负责指定rmi系统远程对象行为的接口和类在java.rmi包中定义的,接下来我们了解一下几个核心接口和类:1、Java.rmi.Remote接口在rmi中,远程接口声明了可从远程java虚
17、拟机中调用的方法集,远程接口必须满足下列条件:远程接口必须至少直接或间接的扩展java.rmi.Remote接口。远程接口中的方法申明必须满足:远程方法申明在其throws子句中除了要包含与应用程序有关的异常之外,还必须包括RemoteException异常(或她的父类);在远程方法申明中,作为参数或返回值申明的远程对象必须申明为远程接口,而非该接口的实现类。2、Java.rmi.RemoteException类RemoteException类是在远程方法调用期间由RMI运行所抛出的异常,在使用了rmi系统的应用程序中,远程接口中申明的远程方法在其throws子句中必须指定RemoteExce
18、ption或者其超类。当远程方法调用由于某种原因失败时,将抛出RemoteException异常。RemoteException类是一个已检验的异常,而不是RuntimeException。3、Java.rmi.server.RemoteObject类RMI服务器函数由RemoteObject类及其子类RemoteServer,UnicastRemoteObject和Activatabble提供。RemoteObject为远程对象敏感的Object方法,hashCode,equals和toString方法提供实现。创建远程对象并将其导出,所需的方法由类UnicastRemoteObject和A
19、ctivatable提供,子类可以识别远程方法。UnicastRemoteObject定义了单个调用的远程对象,其引用只有在服务器进程运行时才有效。类Activatable是抽象类,它定义的activatable远程对象在其远程方法被调用时开始执行,并在必要时自己关闭。4、Java.rmi.registry.LocateRegistry类LocateRegistry类用于获得对特定主机的引导远程对象注册服务程序的引用(创建stub),或者创建能在特定端口接受调用的远程对象注册服务程序,注册服务程序实现将远程对象名与远程对象引用关联的简单命名语法,服务器重新启动不会记住这些名字和远程对象之间的绑
20、定。LocateRegistry类中的方法:public static Registry getRegistry() throws RemoteExceptionPublic static Registry getRegistry(int port ) throws RemoteExceptionPublic static Registry getRegistry(String host ) throws RemoteExceptionPublic static Registry getRegistry(String host , int port) throws RemoteExceptio
21、nPublic static Registry getRegistry(String host, int port ,RMIClientSocketFactory csf ) throws RemoteExceptionPublic static Registry createRegistry(int port )throws RemoteExceptionPublic static Registry createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteExc
22、eption5、Java.rmi.Naming类Naming类提供了存储和获得远程对象注册服务程序中的远程对象进行引用的方法Naming类中的方法以url的形式作为其中的一个参数,/host:port/name当远程对象使用rmi注册服务程序在本地主机上进行过注册后,远程主机上的调用程序就可以按名称查询远程对象,获得其引用,然后在对象上调用远程方法。Public static Remote lookup(String name) throws NotBoundException, MalformedURException, RemoteExceptionPublic static void b
23、ind(String name, Remote obj) throws AlreadyBoundException, MalforedURException, RemoteExceptionPublic static void unbind (String name) throws RemoteException, NotBoundException,MalformedURLExceptionPublic static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException6、Java
24、.rmi.server.UnicastRemoteObject类类UnicastRemoteObject创建并导出远程对象,该类实现的远程服务具有以下特点:将这种对象的引用至多仅在创建该远程对象的进程生命周期内有效。通过TCP传输与远程对象通信调用,参数和结果使用流协议在客户端和服务器之间进行通信。7、Stub和skeleton在远程对象的通信过程中,rmi使用标准机制:stub和skeleton图14.5 Stub和SkeletonStub的功能初始化与包含远程对象的远程机器的连接。对远程机器参数进行编组(写入并传输)。等待方法调用结果。读取返回值或返回的异常。将值返回给调用程序。Skele
25、ton的功能在远程机器中,每个远程对象都可以有相应的skeleton,skeleton负责将调用分配给实际的远程对象实现,他的主要功能如下:读取远程方法的参数。调用实际远程对象实现上的方法。将结果(返回值或异常)编组(写入并传输)给调用程序。1.4 JNDI基本概念JNDI诞生的理由似乎很简单。随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过Socket等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。RMI技术,RMI-IIOP技术的产生,使远程对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI技术产生后,就可方便的查找远程或是本地对象。1、JND
26、I是什么?JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI提供的接口,能够通过名字定位用户、机器、网络、对象服务等。命名服务:就像DNS一样,通过命名服务器提供服务,大部分的J2EE服务器都含有命名服务器。目录服务:一种简化的RDBMS系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY等。2、JNDI的好处:包含大量命名和目录服务,可以使用相
27、同API调用访问任何命名或目录服务。可以同时连接多个命名和目录服务。允许把名称同JAVA对象或资源关联起来,不必知道对象或资源的物理ID。使用通用接口访问不同种类的目录服务使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API上。1.5 JNDI应用程序结构JNDI的结构由一个API和一个SPI组成,Java应用程序实用JNDI API访问各种各样的命名和目录服务。图14.6 JNDI应用程序结构1、JNDI上下文前面提到命名服务是将名称与对象相关联。这种关联被称为绑定。一组这样的绑定被称为上下文,Jndi上下文可以用来查找,捆绑/解除捆绑,创建或者破坏绑定名称操作在JNDI中,上下
28、文是使用javax.naming.Context接口来表示的,而这个接口也正是与命名服务进行交互的主要接口。Context接口中的每个命名方法都有两种重载的形式:lookup(String name):接受一个字符串名称参数,查找绑定远程对象。lookup(javax.naming.Name):接受一个结构化的名称,查找绑定远程对象。2、初始化上下文InitialContext是一个实现了Context接口的类。使用这个类作为您到命名服务的入口点。创建一个InitialContext对象构造器需要采用一组属性,形式为java.util.Hashtable或其子类之一,比如:代码范例5Prope
29、rties props = new Properties();props.setProperty(java.naming.factory.initial, erfaces.NamingContextFactory);props.setProperty(vider.url, localhost:1099);InitialContext= new InitialContext(props);要通过JNDI进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI驱动的类名(java.naming.factory.initial)和提供命名服
30、务的URL(vider.url)。因为Jndi的实现产品有很多。所以java.naming.factory.initial的值因提供JNDI服务器的不同而不同,vider.url的值包括提供命名服务的主机地址和端口号。下表列出了用于所支持的服务提供程序的工厂类。表: Context.INITIAL_CONTEXT_FACTORY的值名称服务提供程序工厂文件系统com.sun.jndi.fscontext.RefFSContextFactoryLDAPcom.sun.jndi.ldap.LdapCtxFactoryRMIcom.sun.
31、jndi.rmi.registry. RegistryContextFactoryCORBAcom.sun.jndi.cosnaming.CNCtxFactoryDNScom.sun.jndi.dns.DnsContextFactory1.6 RMI与JNDI集成通过上面对JNDI的了解我们可以利用JNDI来管理RMI远程对象的注册服务,我们将代码范例3进行如下改写:代码范例6package com.itjob.rmi;import java.rmi.*;import java.rmi.registry.*;import javax.naming.*;public class RmiSampl
32、eServerJndipublic static void main(String args) throws ExceptionLocateRegistry.createRegistry(8808);RmiSampleImpl server=new RmiSampleImpl();System.setProperty(Context.INITIAL_CONTEXT_FACTORY,com.sun.jndi.rmi.registry.RegistryContextFactory);System.setProperty(Context.PROVIDER_URL,rmi:/localhost:8808);InitialContext ctx=new InitialContext();ctx.bind(java:comp/env/SampleDemo,server);ctx.close();启动服务端程序如图所示:图14.7 JNDI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国智能旅游业市场深度调研及发展战略与投资前景预测研究报告
- 2026乳制品加工业市场环境供需持续性分析及投资收益必要性规划研究
- 2026农机行业风险投资发展方向及融资策略研究报告
- 2026区块链技术行业市场深度调研及投资前景与投资策略研究报告
- 2026媒体娱乐行业市场供需分析及投资风险评估规划设计报告
- 2026中国叶黄素酯行业信用体系建设与商业合作模式创新
- 2026农业科技行业市场深度研究及发展趋势与投资策略规划分析报告书
- 2026浙大历史面试题目及答案
- 2026专项工作面试题及答案
- 2026-2030全球与中国钢材加工配送行业发展现状及趋势预测分析研究报告
- 《DLT 2690.7-2023电供暖系统技术规范 第7部分:运营服务平台》专题研究报告
- 2025年及未来5年市场数据中国无水氢氧化锂行业市场调查研究及投资前景预测报告
- (小升初)2025-2026学年湖南省衡阳市人教版六年级下学期期末数学试卷-附解析
- 2025年设备工程项目管理能力新版真题卷附解析设备监理师
- 财务报表审核培训
- 5万吨年叔丁胺生产装置工艺设计
- T-ZZB 2708-2022 化妆品包装用玻璃瓶
- 2025年公务员面试国际发展合作问题与答案
- GB/T 3672.1-2025橡胶制品的公差第1部分:尺寸公差
- (2025年标准)设备抵账协议书
- 轧钢工(高级)轧钢工职业技能考试题(附答案)
评论
0/150
提交评论