jdk rmi 代码分析

xiaoxiao2026-06-13  10

[i][b]RMI[/b][/i] 早期对于rmi来说,客户端需要stub,服务器端需要skeleton. [*]jdk因为有了反射,而不需要Skeleton [*]jdk因为有了aop,而不需要Stub [*]对于Registry来说,还是使用默认RegistryImpl_Skel,RegistryImpl_Stub. [b][i]什么是rmi[/i][/b] 我在这里不解释他的字面意思,因为这个太原始 rmi是sun开发,遵循JRMP协议,因为他被发布在jre中,所有很多人只把它当作很普通的api来使用,所以它里面做了什么,很多人都不清楚. rmi到底是什么? [list] [*]rmi是一套足够优秀的socket框架. [*]rmi是相对比较简单命名服务 [*]rmi是aop的经典实用例子 [*]相关辅助功能,比如本地GC [/list] [i][b]socket框架[/b][/i] socket框架在早期就是起一个serversocket,socket来连接它,server根据传过来的key来做相应的返回(自己的协议),这是最原始的网络开发。 目前企业开发都是面向对象,什么都是以对象为单位,所有socket框架首先就应该隐藏上面的协议,以对象为单位。 [*]对象调用 比如:Hello是一个接口,有一个print()方法。 Hello hello = ... 记住得到hello这个对象是使用aop包装过的Hello对象(jdk1.5以后,如果以前的版本得到是Hello_Stub,这个需要预先生产)hello.print(); 远程调用在这里,包括返回。 [*]对象暴露 使用:java.rmi.server.UnicastRemoteObject.exportObject(Remote obj,int port) 在暴露的过程中产生相关remote接口的aop实现,并注册到registry中去. [b][i]命名服务[/i][/b] 服务器端对象暴露,并把接口的aop实现注册到registry中去,客户端只需要registry.lookup接口的aop即可,并可以通过这个aop接口实现于接口真正实现通信。 [b][i]aop[/i][/b] 目前aop,在运行态使用的,我知道有两种一种是jdk中java.lang.reflect,一个就是asm。其他的好像对他们的包装,比如cglib. [i][b]rmi的log[/b][/i] rmi日志管理使用java.util.logging 例子logging.properties handlers= java.util.logging.FileHandler.level= SEVEREjava.util.logging.FileHandler.level = ALLjava.util.logging.FileHandler.pattern = d:\\java1.log java.util.logging.FileHandler.limit = 50000java.util.logging.FileHandler.count = 1java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormattersun.rmi.transport.level = FINE [b][i]rmi端口[/i][/b] rmi分两个端口 [*]rmi名称服务端口 api使用方法:LocateRegistry.createRegistry(端口) [*]服务端口 api使用方法:UnicastRemoteObject.exportObject(服务对象,端口),多次调用这个方法,如果端口一样,会使用同一个serversocket,不会发生错误 [b][i]spring使用[/i][/b] spring使用包装过的rmi,服务对象不再需要实现Remote接口, 我们平时使用只会使用registryPort,而不是忘记使用servicePort.如果不指定servicePort,servicePort=0,将会有系统指定。 [i][b] rmi属性[/b][/i] [*]sun.rmi.transport.tcp.readTimeout: 等同于socket.setSoTimeout(int timeout),RMI默认值是2 * 3600 * 1000,2个小时. [*]sun.rmi.transport.tcp.handshakeTimeout: socket握手超时设置,默认一分钟. [*]sun.rmi.transport.tcp.responseTimeout: socket 读超时设置,只有当RMISocketFactory相关属性没有设置,才起作用,默认不超时 [*]sun.rmi.transport.connectionTimeout: rmi的socket是长期连接的,只有timeout时,才会socket.close();默认是的值是15 [*]sun.rmi.transport.tcp.responseTimeout: 客户端socket的timeout, 默认不超时
转载请注明原文地址: https://www.6miu.com/read-5050106.html

最新回复(0)