Apache HttpClient与CLOSE_WAIT

前几天开始服务器时不时无法accept新连接,由于线上环境的原因都没时间调试直接重启了事
昨天频繁发生了几次,仔细看了下系统日志发现:

1
java.net.SocketException: Too many open files

用netstat看发现有大量的CLOSE_WAIT,搜索发现与libcurl的处理类似,apache-commons的HttpClient也默认保持了连接待复用处理。

解决办法:

  • 每次使用完都完全关闭连接

    1
    httpmethod.setRequestHeader("Connection", "close");
  • 使用统一的连接管理器复用连接,例如SimpleHttpConnectionManager,从连接管理器里获取连接,然后定时的用连接管理器来释放空闲连接。在比较频繁的抓取项目中推荐复用连接

参考文章:http://swordinhand.javaeye.com/blog/149408