RMI 连接超时时间设定
2015-08-19 10:45
453 查看
System.setProperty("sun.rmi.transport.tcp.responseTimeout", "2000");
System.setProperty("sun.rmi.transport.tcp.readTimeout", "2000");
System.setProperty("sun.rmi.transport.connectionTimeout", "2000");
System.setProperty("sun.rmi.transport.proxy.connectTimeout", "2000");
System.setProperty("sun.rmi.transport.tcp.handshakeTimeout", "2000");
我向如果问度娘也只能等到上面的内容了,但是当我们设定好了以后,也不好使,这个时候我们就怀疑是不是我们审定的值没有影响当其中的内容。其实不然,里面的数据已经被改写。
做一下分析:
这里最后可能应当链接超时的是“sun.rmi.transport.proxy.connectTimeout”。其实SUN说明文档中也是这么提出的:
The value of this property represents the maximum length of time (in milliseconds) that the Java RMI runtime will wait for a connection attempt (
但是这个时候我们需要看清“
该属性作用的类是:RMIMasterSocketFactory,有人会问我是怎么知道的,这个嘛,我说经验信吗?“看”个玩笑了。在Socket中设定断电,就可以看到其中的调用过程。
当时RMIMasterSocketFactory并没有提供源代码,也无法查到源代码。当时我可以看到这个类中的属性有connectTimeout,当然这个无法断定connectTimeout对应的就是“sun.rmi.transport.proxy.connectTimeout”,
当时我们看不见源代码,但是可以得到该类的字节码,在getConnectTimeout()方法中可以看到“ ldc <String "sun.rmi.transport.proxy.connectTimeout">”内容,表示它使用了“sun.rmi.transport.proxy.connectTimeout”个字符串,还有static{}(“静态构造方法”,作用是和对象的构造方法相同,区别是该方法值初始化静态变量)方法中第1223,1224行(把字节码内容拷贝当编辑器中)
22 invokestatic sun.rmi.transport.proxy.RMIMasterSocketFactory.getConnectTimeout() : long [308]
25 putstatic sun.rmi.transport.proxy.RMIMasterSocketFactory.connectTimeout : long [259]
(invoke, static sun.rmi.transport.proxy.RMIMasterSocketFactory.getConnectTimeout(),long):执行RMIMasterSocketFactory中的静态方法getConnectTimeout,返回值是long型)
(put,static sun.rmi.transport.proxy.RMIMasterSocketFactory.connectTimeout, long):自悟吧。
这两行表示执行getConnectTimeout()方法,对connectTimeout 静态属性进行赋值,(转为源代码就是 connectTimeout = getConnectTimeout()),所以看得出在加载RMIMasterSocketFactory类的时候,就会获取“sun.rmi.transport.proxy.connectTimeout”属性中的值对connectTimeout 进行赋值,说以当程序在加载RMIMasterSocketFactory类前调用System.setProperty("sun.rmi.transport.proxy.connectTimeout", "2000"); 就可以了。
System.setProperty("sun.rmi.transport.proxy.connectTimeout", "2000");
Naming.lookup( "rmi://xxx.xxx.xxx.xxx:xxxx/xxxxxxxx")
但是这样还是不行的。因为上面文档中说了。还有连个属性没有赋值了。
好吧,这条路我也算得上放弃了。
后来详细,其实RMI底层通信也是使用Socket的,在Socket中connect有连个实现,其中一个就是带有超时时间,所有这个时候我们就不实用Naming进行lookup,工具一个自己的Naming不就可以了嘛。
好吧,上面就当放屁了。下面才是正解
Naming.lookup("rmi://xxx.xxx.xxx.xxx:xxxx/xxxxxxxx");
改为↓↓↓↓↓
Registry registry = LocateRegistry.getRegistry("xxx.xxx.xxx.xxx", xxxx, new RMIClientSocketFactory() {
@Override
public Socket createSocket(String host, int port) throws IOException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 2000);
return socket;
}
}); // registry最好是全局一个的(一个IP对应一个registry,也可以是多个,这个只是建议)
registry.lookup("xxxxxxxx");
好了。可以了。至于绑定对象还是用Naming.rebing把,没有问题。的。。。。。
突然想起一件事来着,本人在大连,求一份“高薪”工作:做过JAVA,C/C++, VBA。邮箱:836847172@qq.com
System.setProperty("sun.rmi.transport.tcp.readTimeout", "2000");
System.setProperty("sun.rmi.transport.connectionTimeout", "2000");
System.setProperty("sun.rmi.transport.proxy.connectTimeout", "2000");
System.setProperty("sun.rmi.transport.tcp.handshakeTimeout", "2000");
我向如果问度娘也只能等到上面的内容了,但是当我们设定好了以后,也不好使,这个时候我们就怀疑是不是我们审定的值没有影响当其中的内容。其实不然,里面的数据已经被改写。
做一下分析:
这里最后可能应当链接超时的是“sun.rmi.transport.proxy.connectTimeout”。其实SUN说明文档中也是这么提出的:
The value of this property represents the maximum length of time (in milliseconds) that the Java RMI runtime will wait for a connection attempt (
createSocket) to complete, before attempting to contact the server using HTTP. This property is only used when the
http.proxyHostproperty is set and the value of
java.rmi.server.disableHttpis
false. The default value is 15000 milliseconds (15 seconds).
但是这个时候我们需要看清“
http.proxyHost”和“java.rmi.server.disableHttp”这两个属性,“This property is only used when......”。
该属性作用的类是:RMIMasterSocketFactory,有人会问我是怎么知道的,这个嘛,我说经验信吗?“看”个玩笑了。在Socket中设定断电,就可以看到其中的调用过程。
当时RMIMasterSocketFactory并没有提供源代码,也无法查到源代码。当时我可以看到这个类中的属性有connectTimeout,当然这个无法断定connectTimeout对应的就是“sun.rmi.transport.proxy.connectTimeout”,
当时我们看不见源代码,但是可以得到该类的字节码,在getConnectTimeout()方法中可以看到“ ldc <String "sun.rmi.transport.proxy.connectTimeout">”内容,表示它使用了“sun.rmi.transport.proxy.connectTimeout”个字符串,还有static{}(“静态构造方法”,作用是和对象的构造方法相同,区别是该方法值初始化静态变量)方法中第1223,1224行(把字节码内容拷贝当编辑器中)
22 invokestatic sun.rmi.transport.proxy.RMIMasterSocketFactory.getConnectTimeout() : long [308]
25 putstatic sun.rmi.transport.proxy.RMIMasterSocketFactory.connectTimeout : long [259]
(invoke, static sun.rmi.transport.proxy.RMIMasterSocketFactory.getConnectTimeout(),long):执行RMIMasterSocketFactory中的静态方法getConnectTimeout,返回值是long型)
(put,static sun.rmi.transport.proxy.RMIMasterSocketFactory.connectTimeout, long):自悟吧。
这两行表示执行getConnectTimeout()方法,对connectTimeout 静态属性进行赋值,(转为源代码就是 connectTimeout = getConnectTimeout()),所以看得出在加载RMIMasterSocketFactory类的时候,就会获取“sun.rmi.transport.proxy.connectTimeout”属性中的值对connectTimeout 进行赋值,说以当程序在加载RMIMasterSocketFactory类前调用System.setProperty("sun.rmi.transport.proxy.connectTimeout", "2000"); 就可以了。
System.setProperty("sun.rmi.transport.proxy.connectTimeout", "2000");
Naming.lookup( "rmi://xxx.xxx.xxx.xxx:xxxx/xxxxxxxx")
但是这样还是不行的。因为上面文档中说了。还有连个属性没有赋值了。
好吧,这条路我也算得上放弃了。
后来详细,其实RMI底层通信也是使用Socket的,在Socket中connect有连个实现,其中一个就是带有超时时间,所有这个时候我们就不实用Naming进行lookup,工具一个自己的Naming不就可以了嘛。
好吧,上面就当放屁了。下面才是正解
Naming.lookup("rmi://xxx.xxx.xxx.xxx:xxxx/xxxxxxxx");
改为↓↓↓↓↓
Registry registry = LocateRegistry.getRegistry("xxx.xxx.xxx.xxx", xxxx, new RMIClientSocketFactory() {
@Override
public Socket createSocket(String host, int port) throws IOException {
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 2000);
return socket;
}
}); // registry最好是全局一个的(一个IP对应一个registry,也可以是多个,这个只是建议)
registry.lookup("xxxxxxxx");
好了。可以了。至于绑定对象还是用Naming.rebing把,没有问题。的。。。。。
突然想起一件事来着,本人在大连,求一份“高薪”工作:做过JAVA,C/C++, VBA。邮箱:836847172@qq.com
相关文章推荐
- 空a标签在IE下无效之解决方法
- Win10预览版10525更改窗口标题栏配色方法图文分享
- 9秒学院crossAPP详解
- 彻底删除SQL Server注册表的方法
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
- C#播放声音
- SQL语句优化方法
- 关于指针的15个经典面试题
- python—networkx:在一张图中画出多个子图
- C# 测试PDF是否能打开 .
- 241个jquery插件—jquery插件大全
- ACM矩形嵌套问题LIS
- 定位服务
- 【android学习笔记】理解android.intent.action.MAIN 与 android.intent.category.LAUNCHER
- 设置TextView与图片的距离
- C++输入字符串输入问题(二)
- 右左法则----复杂指针解析
- SSlSocket和SSLServerSocket的学习
- PHP学习2,Session的使用
- 从零开始学JAVA DAY2