httpclient 假死问题

之前总是发现 httpclient 有假死的问题,各种超时时间都设置了,都不能解决,最近跟踪了下,发现是 dns 解析地方的超时导致,在 InetAddress.getByName 卡住

 

虽然Socket类有setTimeout()方法,URLConnection有setConnectTimeout()方法,但这都不能给DNS查询过程添加时间限制,也就是说,如果DNS服务器挂了,那么代码就会阻塞几十秒才能抛出异常。我最近就遇到了这个问题,当DNS服务器出问题的时候,setTimeout()设置的超时时间就不起作用了。

 

经过google,发现Java目前居然还没有现成的API来处理DNS查询超时的问题。不过一个老外的博客上给出了一种曲线救国的方法:

public class DNSLookupThread extends Thread {

private InetAddress addr;

private String hostname;

 

public DNSLookupThread(String hostname) {

this.hostname = hostname;

}

 

public void run() {

try {

InetAddress add = InetAddress.getByName(hostname);

set(add);

} catch (UnknownHostException e) {

}

}

 

private synchronized void set(InetAddress addr) {

this.addr = addr;

}

 

public synchronized String getIP() {

if (null != this.addr) {

return addr.getHostAddress();

}

 

return null;

}

}

 

见 http://blog.csdn.net/neosmith/article/details/43235335

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值