You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Rusty <do...@gmail.com> on 2012/02/29 14:13:00 UTC
HttpGet Method failed: HTTP/1.0 503 Service Unavailable-Help!
Hello all guys,thanks for reading
Such an annoying problem occurred to me,hoping someone help me
The problem:
1.threads share a DefaultHttpClient
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)and in my inital function
cm.setMaxTotal(100);
http.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
3)and then is my thread function
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)And then I create 10 threads to call the getUrl function,but after about
1000 loops,shit happens:
*HttpGet Method failed: HTTP/1.0 503 Service Unavailable*
But I used IE and the proxy to open the url ,it's opened successfully.So it
seems nothing wrong with my proxy.
So what's wrong?
2.Then I changed the creation of httpclient to the getUrl() function,so
threads don't share DefaultHttpClient,like that:
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); *
* 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;*
}
return result;
}
and then after about 600 loops of 10 threads,another shit happens:
*Exception in thread "Thread-11" java.lang.OutOfMemoryError: Java heap space
*
*Exception occurs in *result = EntityUtils.toString(entity);
So,really need some help.
Thanks!