Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache HTTPClient头请求的最高性能?_Java_Apache Httpclient 4.x - Fatal编程技术网

Java Apache HTTPClient头请求的最高性能?

Java Apache HTTPClient头请求的最高性能?,java,apache-httpclient-4.x,Java,Apache Httpclient 4.x,我使用ApacheCommons4.xHttpClient向URI发出HEAD请求,只是为了获得该链接的最终post 302 URL位置。例如:真的指向cnn.com之类的网站。在一台可以运行数月而不会泄漏的服务器上,使用HttpClient实现这一点的最佳和最有效的方法是什么?现在我遇到了这样一个问题:每x分钟,所有线程都会在试图将连接从池中拉出时冻结,并且它们都会超时 我计划让100个工作线程执行抓取,所以我使用了线程连接管理器 更新这里是我用来获取httpClient对象的代码 HttpP

我使用ApacheCommons4.xHttpClient向URI发出HEAD请求,只是为了获得该链接的最终post 302 URL位置。例如:真的指向cnn.com之类的网站。在一台可以运行数月而不会泄漏的服务器上,使用HttpClient实现这一点的最佳和最有效的方法是什么?现在我遇到了这样一个问题:每x分钟,所有线程都会在试图将连接从池中拉出时冻结,并且它们都会超时

我计划让100个工作线程执行抓取,所以我使用了线程连接管理器

更新这里是我用来获取httpClient对象的代码

HttpParams httpParams = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);

HttpConnectionParams.setSoTimeout(httpParams, 5000);

ConnManagerParams.setMaxTotalConnections(httpParams, 5000);

HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);



ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRoute() {

   @Override

   public int getMaxForRoute(HttpRoute route) {

     return 35;

   }

 });

emptyCookieStore = new CookieStore() {

    @Override

    public void addCookie(Cookie cookie) {



    }

    ArrayList<Cookie> emptyList = new ArrayList<Cookie>();



    @Override

    public List<Cookie> getCookies() {

      return emptyList;

    }

    @Override

    public boolean clearExpired(Date date) {

      return false;

    }



    @Override

    public void clear() {

    }

  };



  // set request params

  httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);

  httpParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

  httpParams.setParameter("http.language.Accept-Language", "en-us");

  httpParams.setParameter("http.protocol.content-charset", "UTF-8");

  httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");

  httpParams.setParameter("Cache-Control", "max-age=0");

  SchemeRegistry schemeRegistry = new SchemeRegistry();

  schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

  schemeRegistry.register(new Scheme("https", PlainSocketFactory.getSocketFactory(), 443));

  final ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParams,schemeRegistry);



  DefaultHttpClient httpClient = new DefaultHttpClient(cm, httpParams);

  httpClient.getParams().setParameter("http.conn-manager.timeout", 120000L);

  httpClient.getParams().setParameter("http.protocol.wait-for-continue", 10000L);

  httpClient.getParams().setParameter("http.tcp.nodelay", true);
HttpParams HttpParams=new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams,5000);
HttpConnectionParams.setSoTimeout(httpParams,5000);
ConnManagerParams.setMaxTotalConnections(httpParams,5000);
HttpProtocolParams.setVersion(httpParams,HttpVersion.HTTP_1_1);
setMaxConnectionsPerRoute(httpParams,新的ConnPerRoute(){
@凌驾
public int getMaxForRoute(HttpRoute路由){
返回35;
}
});
emptyCookieStore=新CookieStore(){
@凌驾
公共void addCookie(Cookie Cookie){
}
ArrayList emptyList=新建ArrayList();
@凌驾
公共列表getCookies(){
返回空列表;
}
@凌驾
公共布尔值已过期(日期){
返回false;
}
@凌驾
公共空间清除(){
}
};
//设置请求参数
setParameter(“http.protocol.cookie策略”,CookiePolicy.BROWSER_兼容性);
setParameter(“http.useragent”、“Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.1;SV1)”);
httpParams.setParameter(“http.language.Accept language”,“en-us”);
httpParams.setParameter(“http.protocol.content字符集”,“UTF-8”);
setParameter(“Accept”,“application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5”);
setParameter(“缓存控制”,“最大年龄=0”);
SchemeRegistry SchemeRegistry=新SchemeRegistry();
register(新方案(“http”,PlainSocketFactory.getSocketFactory(),80));
register(新方案(“https”,PlainSocketFactory.getSocketFactory(),443));
final ClientConnectionManager cm=新的ThreadSafeClientConnManager(httpParams,schemeRegistry);
DefaultHttpClient httpClient=新的DefaultHttpClient(cm,httpParams);
httpClient.getParams().setParameter(“http.conn-manager.timeout”,120000L);
httpClient.getParams().setParameter(“http.protocol.wait for continue”,10000L);
httpClient.getParams().setParameter(“http.tcp.nodelay”,true);

很可能有太多的工作线程在争夺极少的连接。请确保将每个路由的最大连接数限制设置为合理的值(默认情况下,限制设置为HTTP规范要求的两个并发连接)

谢谢oleg,我已更新以显示我的代码。。。我目前将它设置为每个主机35个,但是如果我有100个线程都试图同时命中bit.ly,也许我应该使用100个?通常建议每个路由具有与最大连接数相同的工作线程数。我是否应该将SetConnectionStalechKingEnabled设置为false?如果是这样的话,那么使用httpclient 4.x是如何做到的?我想我找到了:httpParams.setParameter(“http.connection.stalecheck”,false);