RMI 连接超时时间设定
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 (createSocket) to complete, before attempting to contact the server using HTTP. This property is only used when the http.proxyHost property is set and the value of java.rmi.server.disableHttp is 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
RMI 连接超时时间设定的更多相关文章
- 转 HttpClient 设置连接超时时间
要: HttpClient 4.5版本升级后,设置超时时间的API又有新的变化,请大家关注. HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳 ...
- nginx——优化 Nginx 连接超时时间
1. 什么是连接超时 (1) 举个例子,某饭店请了服务员招待顾客,但是现在饭店不景气,因此要解雇掉一些服务员,这里的服务员就相当于 Nginx 服务建立的连接 (2) 当服务器建立的连接没有接收处理请 ...
- HttpClient设置连接超时时间
https://www.cnblogs.com/winner-0715/p/7087591.html 使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间.这两个参数很重要,目的是为 ...
- 解决ssh连接超时时间(ssh timeout)的设置方法
本文介绍下,linux中ssh连接超时时间的设置方法,以避免总是被强行退出.有需要的朋友,参考下吧.有关修改ssh连接超时时间的方法,网上介绍的很多了.比如下面这个:可以减少ssh连接超时等待的时间: ...
- 更改THttpClientSocket连接超时时间
更改THttpClientSocket连接超时时间 THttpClientSocket连接超时时间默认是30秒,如果要设大点,可用下面的代码: procedure TForm1.FormCreate( ...
- httpclient: 设置请求的超时时间,连接超时时间等
httpclient: 设置请求的超时时间,连接超时时间等 public static void main(String[] args) throws Exception{ //创建httpclien ...
- golang中mysql建立连接超时时间timeout 测试
本文测试连接mysql的超时时间. 这里的"连接"是建立连接的意思. 连接mysql的超时时间是通过参数timeout设置的. 1.建立连接超时测试 下面例子中,设置连接超时时间为 ...
- MySQL的8小时连接超时时间,导致系统过夜即崩溃,报错Could not roll back Hibernate transaction
2014年3月开始给单位开发<机关规范化管理网络平台>,10月底成功上线运行,但是存在一个bug: 部署环境: apache tomcat 6.0.41 + mysql5.5 + jbpm ...
- ssh连接超时时间(ssh timeout)的设置方法
问题:当某台远程主机宕机时,ssh远程过去会耗费很多的时间去连接,结果还是会失败. 这个时候可以设置超时时间 ssh -o ConnectTimeout= 192.168.0.10
随机推荐
- iOS:App上架流程和支付宝支付流程
App上架大致流程: 1.花99美元在苹果开发中心注册一个开发者账号: 2.登陆开发者账号,进入member Center,即开发者成员中心: 3.选取证书标示符(certificates Ident ...
- shell脚本之检查局域网中在线的ip地址
[root@docker-node1 ]# cat ping.sh #!/bin/bash . /etc/init.d/functions for var in {1..254}; do ip=192 ...
- Yii2系列教程六:集成编辑器
上一篇文章我们实现了简单的用户权限管理,至于更先进的RBAC,我后面会单独出一篇文章来说说.在这一篇文章当中,我主要想写的是在Yii2中集成一个编辑器,因为在我们的实际开发当中,一个简单的textar ...
- 【前后台分离模式下,使用OAuth Token方式认证】
AngularJS is an awesome javascript framework. With it’s $resource service it is super fast and easy ...
- Java 9的14个新特性总结
Java 9 包含了丰富的特性集.虽然Java 9没有新的语言概念,但是有开发者感兴趣的新的API和诊断命令. 我们将快速的,着重的浏览其中的几个新特性: 模块化系统–Jigsaw 项目 模块化是一 ...
- 获取request中的查询参数
//获取request中的查询参数 public static Map<String, Object> getRequestParamsByMap(HttpServletRequest r ...
- MVC你是怎样理解的?
近期的学术交流会议都在研究MVC,秉着好好学习,天天向上的心理,时不时的就去蹭会.说实话,原来也有看过MVC的一些相关资料,可是仅仅是浅尝辄止.并且,由于先学了三层,所以再看MVC的时候,潜意识里的就 ...
- 在CMD中查看端口被什么程序占用
我们要查看端口被什么程序占用,可以使用下面方法.比如端口28848 1. 打开cmd,输入命令netstat -ano | findstr ":28848",显示结果如下,最后一个 ...
- charles抓包工具使用指南
前言 移动APP抓包 PC端抓包 查看模式 其他功能 问题汇总 1. 前言: Charles是一款抓包修改工具,相比起burp,charles具有界面简单直观,易于上手,数据请求控制容易,修改简单,抓 ...
- [k8s]openshiftv1.5.1安装笔记
centos7安装 net.ifnames=0 biosdevname=0 初始化系统 yum install wget -y wget -O /etc/yum.repos.d/CentOS-Base ...