[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()方法。
[*]对象暴露
使用: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
[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, 默认不超时
早期对于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= SEVERE
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.pattern = d:\\java1.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
sun.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, 默认不超时