お読みいただきありがとうございます。HttpClient:HttpGetメソッドが失敗しました:HTTP/1.0 503サービスが利用できません
このような厄介な問題が私に発生しました。私は誰かが私を助けてくれることを望んでいます。 私はいくつかのURLを開いてコンテンツをスクラップするためにjavaでhttpcomponent(旧バージョンのhttpclientの新しいバージョン)を使用しています。また、multihtreadはパフォーマンスを向上させるために使用されます。
だから、問題は次のとおりです。
1.threadsはHttpClientを
1)Defination
private static final ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
private static HttpHost proxy = new HttpHost("127.0.0.1",8086,"http");
private static DefaultHttpClient http = new DefaultHttpClient(cm);
2)と私のinital機能に
cm.setMaxTotal(100);
http.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
3)を共有します私のスレッド機能です
public static String getUrl(String url, String Chareset)
{
HttpGet get = new HttpGet(url);//uri
get.setHeader("Content-Type", "text/html");
get.setHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215;)");
get.setHeader("Accept-Charset", Chareset+";q=0.7,*;q=0.7");//"utf-8;q=0.7,*;q=0.7");
get.getParams().setParameter("http.socket.timeout",new Integer(CONNECTION_TIMEOUT));//20000
String result = "";
try {
HttpResponse response = http.execute(get);
if (response.getStatusLine().getStatusCode() != 200){//statusCode != HttpStatus.SC_OK) {
System.err.println("HttpGet Method failed: "
+ response.getStatusLine());//httpGet.getStatusLine()
}
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
EntityUtils.consume(entity);
entity = null;
}
} catch(java.net.SocketException ee)
{
ee.printStackTrace();
Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ee);
}
catch (IOException e) {
//throw new Exception(e);
Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, e);//TODO Debug
} finally {
get.abort();//releaseConnection();//TODO http.getConnectionManager().shutdown();?
get = null;
}
return result;
}
4)そして、私はのgetURL()関数を呼び出すために10個のスレッドを作成しますが、約1000のループの後、たわごとが起こる:
**HttpGet Method failed: HTTP/1.0 503 Service Unavailable**
しかし、私は、それはだ、URLを開くためにIEとプロキシを使用それは私の代理人に何も間違っていないことを意味します。
何が問題なのですか? 10件のスレッドの約600ループ、別のたわごと後
public static String getUrl(String url, String Chareset)
{
HttpGet get = new HttpGet(url);//uri
get.setHeader("Content-Type", "text/html");
get.setHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50215;)");
get.setHeader("Accept-Charset", Chareset+";q=0.7,*;q=0.7");//"utf-8;q=0.7,*;q=0.7");
get.getParams().setParameter("http.socket.timeout",new Integer(CONNECTION_TIMEOUT));//20000
DefaultHttpClient http = new DefaultHttpClient(cm);//threads dont't share it
http.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
String result = "";
try {
HttpResponse response = http.execute(get);
if (response.getStatusLine().getStatusCode() != 200){//statusCode != HttpStatus.SC_OK) {
System.err.println("HttpGet Method failed: "
+ response.getStatusLine());//httpGet.getStatusLine()
}
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
EntityUtils.consume(entity);
entity = null;
}
} catch(java.net.SocketException ee)
{
ee.printStackTrace();
Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ee);
}
catch (IOException e) {
//throw new Exception(e);
Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, e);//TODO Debug
} finally {
get.abort();//releaseConnection();//TODO http.getConnectionManager().shutdown();?
get = null;
http = null;//clean almost all the resources
}
return result;
}
、その後に:スレッドがそのように、HttpClientを共有していないので、私は、のgetURL()関数にHTTPClientのの作成を変え
2.Then起こる:
**Exception in thread "Thread-11" java.lang.OutOfMemoryError: Java heap space*
*
例外結果= EntityUtils.toString(エンティティ)で起こります。 line
だから、本当に助けが必要です。
ありがとうございます!
私は拒否されていることが判明しました。拒否されないようにするには、2番目の方法を使用する必要があります。新しいスレッドごとのHTTPClientを使用する必要があります。Java gc()が遅すぎるため、sleep()が良いアイデアかもしれません。プログレスをフラグでリセットして、進捗状況を示します。すべての答えをありがとう! – Jacob
私はついにそれを理解しました。この方法はうまくいきます。そして、どこか他の場所にメモリリークがあります。申し訳ありません。 – Jacob