2009-10-14 2 views
2

Я использую ThreadSafeClientConnManager для управления пулом подключений клиента , поскольку мое приложение имеет несколько потоков, которые одновременно подключаются к веб-серверу.Отменить/прервать соединение из пула соединений ThreadSafeClientConnManager

Аннотация Пример кода:

HttpClient httpClient; 
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg); 
httpclient = new DefaultHttpClient(conMgr, parameters); 

Теперь давайте говорить на этой резьб загрузки большого файла, но пользователь мое приложение переходит на другой вид деятельности/экран. Поэтому файл бесполезен, и я хотел бы прекратить это подключение для загрузки.

В ThreadSafeClientConnManager я нашел этот метод:

public ClientConnectionRequest requestConnection (HttpRoute route, Object state) Возвращает новый ClientConnectionRequest, из которого ManagedClientConnection может быть получен или запрос может быть прервана.

До сих пор я использую:

HttpGet httpRequest = new HttpGet(URL_TO_FILE); 
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); 
[...] 

Теперь от того, что я понимаю, у меня использовать:

httpclient.getConnectionManager().requestConnection(HttpRoute route, Object state);

И это та точка, где я застрял. Я предполагаю, что для маршрута я могу просто использовать new HttpRoute(new HttpHost("10.0.0.1")) или что-то еще, что мой сервер, но что положить в Object state?

И, во-вторых, как только у меня есть ClientConnectionManager Я могу позвонить getConnection(long timeout, TimeUnit tunit). Но потом оттуда, как я делаю, я выполняю свой HttpGet httpRequest = new HttpGet(URL_TO_FILE);, как и раньше, с HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);?

Я прошел через документацию и опробовал несколько разных вещей, но я не смог получить рабочее решение. Поэтому любые предложения и/или примеры кода более чем приветствуются.

ответ

2

Вам просто нужно позвонить httpRequest.abort() и соединение должно быть закрыто.

С большим файлом вы должны обработать данные цикла. Вы можете просто проверить состояние отмены и отмены оттуда,

HttpEntity entity = response.getEntity(); 
    if (entity != null) { 
     InputStream instream = entity.getContent(); 
     while (instream.read(buf) >= 0) { 
      if (cancelled) 
       httpRequest.abort(); 
      // Process the file 
     } 
    } 

При объединении или используется KeepAlive, дефектное соединение не может быть возвращен в пул, и он должен быть закрыт. В более старых версиях появилась ошибка, что соединение сохраняется в памяти, и это забивает следующий запрос. Я думаю, что все это исправлено.

+0

Спасибо. Это намного проще, чем то, что я пытался сделать ;-) Соединение не появляется в netstat больше после abort(). Я предполагаю, что он тогда закрыт. – znq