- 浏览: 45967 次
- 性别:
- 来自: 南京
文章分类
最新评论
RMI(remote method invoke)
一、基本原理
RMI通过代理来负责客户和远程对象之间通过socket进行通信的细节。
RMI分别为远程对象生成了客户端代理和服务端代理。客户端的叫stub,服务端的叫Skeleton。
Stub进行参数编组,将下列信息发给服务端:
1)要访问的远程对象的名字
2)被调用的方法的描述
3)编组后的参数的字节序列
服务端由skeleton来处理这一信息,进行下列动作
1)反编组参数
2)定位要访问的对象
3)调用远程对象相应的方法
4)对返回值或者异常进行相应的编组
5)将编组后的内容发给客户端。
二、创建一个RMI应用
1、创建远程类接口
1)直接或间接继承Remote接口
2)接口中所有的方法抛出RemoteException异常
2、创建远程类,实现远程接口
1)远程类继承UnicastRemoteObject,
2)可以不继承,直接在构造函数中调用UnicastRemoteObject.exportObject(this,0).
3)远程类的构造函数需要声明抛出RemoteException
4)远程方法必须抛出RemoteException
3、创建服务器程序,
通过 JNDI的javax.naming.Context在rmigegistry注册表中注册远程对象。
几个方法bind,rebind,lookup,unbind
创建远程对象:
HelloService service1 = new HelloServiceImpl("service1");
Context namingContext = new InitialContext();
namingContext.rebind("rmi:HelloService",service1);
4、创建客户端程序。
获取远程对象的存根对象
String url = "rmi://localhost/";
HelloService service1 = (HelloService) namingContext.lookup(url
+ "HelloService1");
三、远程对象设计工厂模式
就是创建一个工厂类和产品类,这个工厂类和产品类都是远程对象,都要实现remote接口,远程方法都要声明RemoteException
1)客户端每次访问一个远程对象的时候,都会得到一个新的stub对象。
2)stub对象重写了equal方法,如果两个stub对象都是对应一个远程对象的代理,则equal返回true。equal不是远程方法。
3)stub对象操作远程方法,会导致远程对象的实现类进行相应的操作。
四、远程方法中的参数与返回值的传递
在服务器端和客户端传递的方法或返回值,必须是远程对象、可序列化对象,或者是基本类型数据,否则在进行远程方法调用的时候会出现UnmarshalException.
五、回调客户端的远程对象
六、远程对象的并发访问
七、分布式垃圾收集
1、RMI框架采用分布式垃圾收集机制。
1)DGC回收规则:一个远程对象不受到任何本地引用和远程引用,这个对象可以被回收。
2)租约通知:通知服务器远程对象被引用了。
3)租约期限:通过java.rmi.dgc.leaseValue来设置。
4)通过实现java.rmi.server.Unreferenced接口,可以来释放相关资源。
5)强制服务端等待客户端获得该远程对象的引用service.isAccessed()
八、远程对象的equals()、hashCode()和clone()方法
stub重写了equal和hashcode方法,没有重写clone
九、使用安全管理器
1、客户端使用安全管理器的两个步骤
1)创建安全策略文件,例如:
grant{
permission java.net.SocketPermission "*:1024-65535","connect";
};
2)为客户端设置安全策略文件和RMISecurityManager
System.setProperty("java.security.policy", SimpleClient.class
.getResource("client.policy").toString());
System.setSecurityManager(new RMISecurityManager());//会从client.policy中读取安全策略
2、通过命令进行设置
java -D java.security.policy=c:\chapter11\client.policy SimpleClient
3、如果服务端需要从客户端动态加载类,也要按照类似方式设置。
十、RMI应用部署以及类的动态加载
java.rmi.server.codebase系统属性,从指定的位置动态加载类文件
十一、远程激活
1、RMI框架提供了一种远程激活机制,当有一个客户去访问远程对象的时候,还去创建这个远程对象。和延迟加载差不多的概念。
rmid:激活系统。远程对象由这个系统来管理生命周期。
2、RMI类介绍
Activatable:可以被激活的远程对象都是这个类的实例,ActivationID表示激活对象的唯一标识符。
ActivationGroup:激活组,可以被激活的对象都放在这里面。
ActivationGroupDesc:描述激活组(属性文件,启动虚拟机的路径)
一个激活组对应一个java虚拟机,rmid程序根据ActivationGroupDesc提供的信息来启动一个java虚拟机,然后在这个虚拟机内创建并管理可以激活的远程对象,每个激活组都有唯一的id,用ActivationGroupID来表示。
ActivationDesc用来描述一个可以激活的远程对象。
ActivationDesc(ActivationGroupID groupID, String className, String location, MarshalledObject data)
3、一个远程对象如果希望被激活,它的远程类应该继承java.rmi.activation.Activatable类。
4、rmid程序激活对象步骤
//1.创建一个激活组描述符ActivationGroupDesc对象
ActivationGroupDesc group = new ActivationGroupDesc(prop, null);
//2.向rmid程序注册ActivationGroup,配置信息由group提供
ActivationGroupID id = ActivationGroup.getSystem().registerGroup(
group);
String classURL = System.getProperty("java.rmi.server.codebase");
MarshalledObject param1 = new MarshalledObject("service1");
MarshalledObject param2 = new MarshalledObject("service2");
//3.创建激活对象描述符ActivationDesc
ActivationDesc desc1 = new ActivationDesc(id,
"activate.HelloServiceImpl", classURL, param1);
ActivationDesc desc2 = new ActivationDesc(id,
"activate.HelloServiceImpl", classURL, param2);
//4.向rmid注册激活对象,配置信息由desc提供
HelloService s1 = (HelloService) Activatable.register(desc1);
HelloService s2 = (HelloService) Activatable.register(desc2);
System.out.println(s1.getClass().getName());
Context namingContext = new InitialContext();
//5.向rmiregistry注册激活对象
namingContext.rebind("rmi:HelloService1", s1);
namingContext.rebind("rmi:HelloService2", s2);
发表评论
-
CORBA笔记
2012-12-06 10:29 1153一、原理和概念1)CORBA独立于任何编程语言,独立于操作系统 ... -
Java性能调优笔记
2012-11-27 15:46 714Java性能调优笔记(http:/ ... -
buffer
2012-11-15 17:00 0Buffer一、Basic Buffer Use四个步骤:1、 ... -
应用线程池
2012-11-13 15:45 894应用线程池一、任务与执行策略之间的隐性耦合。1、有些类型的任务 ... -
Thread 学习小结
2012-10-09 17:36 8051.ThreadFactory 创建线程 ... -
CyclicBarrier理解
2012-08-29 17:13 975package com.zhoubo.concurrent.b ... -
FutureTask实例
2012-08-24 16:08 948package com.zhoubo.concurrent.f ... -
CountDownLatch示例
2012-08-24 11:31 757import java.util.concurrent.Cou ... -
Task Cancellation
2012-08-15 17:35 07.1. Task Cancellation An activ ... -
Finding Exploitable Parallelism
2012-08-15 17:32 11366.3. Finding Exploitable Parall ... -
The Executor Framework
2012-08-12 17:41 18456.2. The Executor Framework Tas ... -
Task Execution
2012-08-11 14:46 550Chapter 6. Task Execution Most ...
相关推荐
RMI(Remote Method Invocation,远程方法调用)是Java提供的一种分布式计算模型,它允许一个Java应用程序通过网络调用另一个远程计算机上的对象的方法。RMI是Java开发分布式应用的重要工具,使得开发者可以像调用...
* 面向 Resource 的中间件(Resource-oriented Middleware):RMI、JMS等 三、中间件的特点 中间件具有以下特点: * 满足大量应用的需要 * 运行于多种硬件和OS平台 * 支持分布计算,提供跨网络、硬件和OS平台的...
我感觉不错的rmi代码; 大家可以参考学习!里面有我的笔记!如有不明白可以发送 E-mail:heitu278@163.com<br><br>可以直接参考这个项目:http://www.zonediy.com<br><br>
分布式技术是现代软件开发中的重要组成部分,它涉及多种技术手段,如CORBA、ORB、RPC、RMI以及中间件等,旨在解决大型系统中复杂度、扩展性和高可用性的问题。本笔记将重点讨论EJB与Java Bean的区别以及Socket编程的...
非常详细java RMI接口编程笔记,实例 且带有详细的说明。
RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。...
Java提供了RMI(远程方法调用)、JMS(Java消息服务)以及近年来流行的微服务框架如Dubbo、Spring Cloud等,用于构建分布式应用。理解这些技术的基本原理和使用方式,有助于开发者构建可扩展、高可用的系统。 代码...
在编程领域,递归是一种强大的概念,它是指一个函数或过程在其定义中调用自身的行为。递归在解决复杂问题时特别有用,因为它允许我们用更简洁的方式表达问题的解决方案。这里我们将深入探讨两个经典的递归示例:计算...
在语言与框架部分,笔记讨论了PHP、Python、Java、JavaScript和Golang等常用编程语言的安全问题,如PHP的后门、反序列化漏洞,Python的格式化字符串攻击,Java的反序列化和RMI/JNDI攻击,JavaScript的沙箱逃逸,以及...
- **RMI**:RMI简化了远程对象的调用,使得开发者可以通过简单的接口调用来访问远程对象,而不需要了解底层通信的细节。 - **容器管理**:EJB容器负责管理组件的生命周期,包括事务管理、安全性和并发控制等,这大大...
在1991年发表的关于“RMI方法和RMI求解器”的笔记中,作者L.C.Hsu详细介绍了关系映射反演(Relation Mapping-Inversion,RMI)方法,并探讨了如何应用这种通用方法于数学科学的不同分支。RMI方法是一种基于可逆映射...
Java 语言中的网络编程机制包括 Socket 编程、HTTP 编程和 RMI 编程等。 数据库编程 Java 语言提供了强大的数据库编程机制,允许开发者创建数据库应用程序,例如数据库管理系统、数据库驱动程序和数据库应用程序等...
`java.rmi`包提供了RMI的实现,包括`java.rmi.server.UnicastRemoteObject`和`java.rmi.registry.Registry`等类。 下面是一些使用套接字进行通信的示例代码片段: ```java // 服务器端 ServerSocket server = new ...
Hessian是一种二进制的Remoting协议,它旨在提供高效的远程方法调用(Remote Method Invocation,RMI)能力,通常用于分布式系统中的服务通信。 【描述】:虽然描述部分为空,但根据提供的博文链接——,我们可以...