Hello everyone,

I'm doing a small stress run from my Workstation to my Laptop.
The code is attached below.

This code emulates a situation where the connection pool runs out of
connections. I'm seeking to catch this situation and act properly.
My problem is that after a connection is being aborted it is never renewed.
Which leaves ThreadSafeClientConnManager completely unable to serve new
requests.

I've traced this by putting a break point on
"System.out.println(Thread.currentThread().getName() + ": START " + new
Date());" then I've stepped all the 4 threads to
"HttpResponse response = httpClient.execute(httpGet, httpContext);"
(ensuring that non of them is in the middle of a session). After the
exception occurs all threads
fail to issue another request, and the ThreadSafeClientConnManager does not
renew it's pool of connections.

I'm looking for a situation that the code will be safe maintaining, meaning
the ThreadSafeClientConnManager will be able to renew "failed" connections,
this will allow me to reattempt event resubmission.

// p.s. On a side note, I would appreciate a quick code review of the usage
with httpclient in the attached sample as I'm new to the library.

Thank you,
Maxim.


The exception looks like this:

"""
Thread-1: START Tue Feb 15 11:15:52 IST 2011
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for
connection
at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417)
 at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300)
at
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-1: END Tue Feb 15 11:20:52 IST 2011
Thread-1: START Tue Feb 15 11:21:15 IST 2011
java.io.IOException: Request already aborted
at
org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-1: END Tue Feb 15 11:21:18 IST 2011
Thread-1: START Tue Feb 15 11:21:23 IST 2011
java.io.IOException: Request already aborted
at
org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-1: END Tue Feb 15 11:21:24 IST 2011
Thread-2: START Tue Feb 15 11:21:34 IST 2011
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for
connection
at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417)
 at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300)
at
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-2: END Tue Feb 15 11:21:35 IST 2011
Thread-0: START Tue Feb 15 11:21:41 IST 2011
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for
connection
at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417)
 at
org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300)
at
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-0: END Tue Feb 15 11:21:42 IST 2011
Thread-0: START Tue Feb 15 11:22:19 IST 2011
java.io.IOException: Request already aborted
at
org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-0: END Tue Feb 15 11:22:20 IST 2011
Thread-0: START Tue Feb 15 11:22:23 IST 2011
java.io.IOException: Request already aborted
at
org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110)
 at
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387)
at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
 at
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eyeview.madservice.mgr.RedirectMgr$GetThread.run(RedirectMgr.java:74)
Thread-0: END Tue Feb 15 11:22:24 IST 2011
"""


The code used to run the test is the following:


"""
import java.io.IOException;
import java.util.Date;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;


public class RedirectMgr {
 static HttpParams HTTP_PARAMS = new BasicHttpParams();
 static {
 HTTP_PARAMS.setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,
Boolean.FALSE);
HTTP_PARAMS.setParameter(CoreConnectionPNames.SO_TIMEOUT, 200);
 HTTP_PARAMS.setParameter(CoreConnectionPNames.SO_REUSEADDR, Boolean.TRUE);
HTTP_PARAMS.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 200);
 HTTP_PARAMS.setParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,
Boolean.FALSE);
}
 public static void main(String[] args) throws IllegalStateException,
IOException, InterruptedException {
 new RedirectMgr().stress();
}
 public void stress() throws InterruptedException {
ThreadSafeClientConnManager threadSafeClientConnManager = new
ThreadSafeClientConnManager();
 threadSafeClientConnManager.setDefaultMaxPerRoute(1);
threadSafeClientConnManager.setMaxTotal(1);
 HttpClient httpClient = new DefaultHttpClient(threadSafeClientConnManager,
HTTP_PARAMS);
 HttpGet httpGet = new HttpGet("http://maxim-lp/index.html";);
 GetThread[] threads = new GetThread[] {
new GetThread(httpClient, httpGet),
 new GetThread(httpClient, httpGet),
new GetThread(httpClient, httpGet),
 new GetThread(httpClient, httpGet)
};
 for(int i = 0; i < threads.length; i++) {
threads[i].start();
}

for(int i = 0; i < threads.length; i++) {
threads[i].join();
 }
}
 class GetThread extends Thread {
private final HttpClient httpClient;
private final HttpContext httpContext;
 private final HttpGet httpGet;
 public GetThread(HttpClient httpClient, HttpGet httpGet) {
 this.httpClient = httpClient;
this.httpContext = new BasicHttpContext();
 this.httpGet = httpGet;
}
 public void run() {
while(true) {
try {
 HttpResponse response = httpClient.execute(httpGet, httpContext);
HttpEntity entity = response.getEntity();
 if(entity != null) {
EntityUtils.consume(entity);
}
 } catch (Exception e) {
System.out.println(Thread.currentThread().getName() + ": START " + new
Date());
 e.printStackTrace();
httpGet.abort();
System.out.println(Thread.currentThread().getName() + ": END " + new
Date());
 //System.exit(1);
}
}
 }
}
}
"""

Reply via email to