虽然大部情况下都是用WS,但RPC在某些情况下还是比较轻便的选择。
http://ws.apache.org/xmlrpc/
config.setConnectionTimeout(5000);
config.setReplyTimeout(6000);
问题主要从这两句代码开始,从网上找到的例子程序,设置这两个参数均不起任何作用,查看rpc的源代码发现在,其使用的TransportFactory并没有在进行socket的时候进行相应的设置,查看其他的TransportFactory,发现真正使用此参数设置socket的是XmlRpcCommonsTransportFactory工厂
XmlRpcClient client = new XmlRpcClient();
client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
client.setConfig(config);
重新设置传输工厂,得到了想要的效果。
现在我们在来说一说timeout与replytimeout
RPC进行网络通信同样使用的是jdk中的socket进行的。
所有 connectiontimeout对应于socket中的connecttimeout
replytimeout对应于socket中的sotimeout
Socket s = new Socket();
s.connect(socketAddress,2000); // 2 秒connect timeout超时
s.setSoTimeout(15000); // 15 秒io超时
看代码中的注释,connecttimeout是连接超时了,例如一个IP并没有在局域网中,你的PC向网络中发了一个包,长时间没有找到回应的主机,就会产生一个连接超时了。而sotimeout是IO超时,服务器已经找到了,而长时间得不到服务器的数据,也就是说socket没有在设置的时间内从IO中读到任何内容就会出再sotimeout超时
这部分更详细的情况可以参看JDK相应的源代码,但是JDK同样是调用dll文件中的方法实现的网络连接的操作,不知道有什么办法可以更详细的查看dll中相应的代码,如果你知道,请回复一下,共同学习。。。。