日期:2014-05-16 浏览次数:21113 次
现在的对外接口一般都是Http + json的,因为简单,语言无关。
Apache HttpClient应该是最常用的Java http组件了。这货有个坑爹的地方,Apache HttpClient如果对方不回应,或者网络原因不返回了,那么HttpClient会一直阻塞。这种情况在公网可能比较容易碰到。在内网时,也有一次因为一台中转的nginx挂掉而导致hessian请求长时间阻塞。
因为Http Client默认的SO_TIMEOUT是0,即一直等待。
这个问题,在帮同事查找问题时碰到好几次了,可能是大家潜意识里认为Http请求是即时的,失败的话也很快返回。
Apache HttpClient的示例也没提到要设置TimeOut,这也是比较坑爹的地方。一个库如果没有默认阻止用户去范错误,那么你也应当在文档,示例代码里提醒用户不要范错误。
有三个可以设置time out 的参数:
httpClient = new DefaultHttpClient(); httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_LINGER, value) httpClient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 3000); httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 3000);
SO_LINGER最好不要设置,可能会坑死人。参考:
http://unliminet.blog.51cto.com/380895/346686
http://stackoverflow.com/questions/3757289/tcp-option-so-linger-zero-when-its-required