`

RMI笔记

阅读更多

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);

 

 

 

分享到:
评论

相关推荐

    rmi学习笔记(1)

    rmi基础知识学习笔记,从最简单的例子讲述rmi的用途

    RMI学习笔记

    RMI从O开始,详细笔记,RMI从O开始,详细笔,记RMI从O开始,详细笔记

    JavaEE5学习笔记02-JNDI与RMI

    JavaEE5学习笔记02-JNDI与RMI.

    rmi代码

    我感觉不错的rmi代码; 大家可以参考学习!里面有我的笔记!如有不明白可以发送 E-mail:heitu278@163.com<br><br>可以直接参考这个项目:http://www.zonediy.com<br><br>

    JAVA RIM接口学习笔记 带有实例

    非常详细java RMI接口编程笔记,实例 且带有详细的说明。

    用Java-RMI实现JDBC远程调用的介绍.pdf

    我在自己的笔记本上开发项目的时候需要连接公司测试环境的数据库,但公司测试环境数据库只能由内网访问...这种情况下可以使用 java rmi远程方法调用技术实现本机项目调用测试环境项目的数据库连接资源实现数据库操作。

    学习笔记:JAVA RMI远程方法调用简单实例

    RMI的概念  RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。...

    递归调用学习笔记

    java递归调用原码,来原于马老师视频内容,并做了一些个人的分析小改动,希望对你有帮助

    java课堂笔记_自己总结的

    反射机制,基本的rmi等 4:还有struts实用程序! 5:最重要的是我在学习和程序开发中积累的错误经验! <br>可能笔记写的很烂,请大家多提意见,多多包涵! 希望大家在共享一些经典书籍的时候,也把自己...

    java进程间通讯笔记

    我整理的java进程间通讯的笔记,包括原理讲解和代码,例子程序。socket、共享内存、RMI、管道。

    分布式技术相关知识学习笔记

    有关分布式的一点学习笔记,都是重点的技术,从概念和技术上分析对比了各种分布式技术的差异

    docker学习思维笔记.xmind

    docker rmi 删除镜像 docker 运行命令 docker copy 主机路径 容器id/名称:容器中路径  镜像 是什么 UnionFS(联合文件系统) 镜像加载原理 分层镜像 为什么采用这种设计 docker ...

    j2ee笔记pdf清晰版

    讲解j2ee中的每一项技术。jsp,servlet,jndi,ejb,jms,jta,rmi,xml....

    Docker 笔记

    Docker 文章目录Docker命令镜像容器容器数据卷数据卷数据卷容器DockerFile关键字 命令 镜像 docker images //列出本地镜像 -a //列出本地所有镜像 -q //只显示镜像ID ...docker rmi //删除镜像 -f //强制删除 doc

    JavaLearnVulnerability:Java漏洞学习笔记 Deserialization Vulnerability

    JavaLearnVulnerabilityJava漏洞学习代码及笔记项目TODO 漏洞代码完善中 漏洞使用和分析笔记准备中 目前文章分析地址在每一个包下package-info.java Java反序列化 Java反射 Java类加载 shiro漏洞分析 weblogic漏洞...

    Java全相关的漏洞以及技术demo(完整项目及相关代码)

    原生Java、Fastjson、Jackson、Hessian2、XML反序列化漏洞利用和Spring、Dubbo、Shiro、CAS、Tomcat、RMI、Nexus等框架\中间件\功能的exploitsJava Security Manager绕过、Dubbo-Hessian2安全等实践代码。...

    Java并发编程(学习笔记).xmind

    远程方法调用(RMI) 正确协同多个对象中的共享状态 正确协同远程对象本身状态的访问 Swing和AWT 事件处理器与访问共享状态的其他代码都要采取线程安全的方式实现 框架通过在框架线程中调用...

    Docker的基本命令使用笔记

    一、系统相关命令: 1.1 查看docker 的版本信息:docker version 1.2 查看docker 系统信息:docker info ...2.4 删除已有的镜像:docker rmi image_name/ id 2.5 查看镜像的历史信息:docker history image_name 2.6

Global site tag (gtag.js) - Google Analytics