Cancelar/abortar uma conexão no pool de conexão ThreadSafeClientConnManager
-
21-09-2019 - |
Pergunta
estou a usar ThreadSaFeclientConnManager para gerenciar um Pool de conexões de clientes, porque meu aplicativo possui vários threads, que estão se conectando simultaneamente a um servidor da web.
Código de amostra abstrato:
HttpClient httpClient;
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
httpclient = new DefaultHttpClient(conMgr, parameters);
Agora vamos dizer que sobre esses threads está baixando um arquivo grande, mas o usuário do meu aplicativo está mudando para outra atividade/tela. Portanto, o arquivo é desnecessário e eu gostaria de abortar essa conexão de download.
Dentro ThreadSaFeclientConnManager Eu encontrei este método:
public ClientConnectionRequest requestConnection (HttpRoute route, Object state)
Retorna um novo ClientConnectionRequest, do qual uma gestão gerenciada pode ser obtida ou a O pedido pode ser abortado.
Até agora eu tenho usado:
HttpGet httpRequest = new HttpGet(URL_TO_FILE);
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
[...]
Agora, pelo que entendi, tenho que usar:
httpclient.getConnectionManager().requestConnection(HttpRoute route, Object state);
E esse é o ponto em que estou preso. Presumo que, para a rota que posso usar new HttpRoute(new HttpHost("10.0.0.1"))
ou qualquer que seja o meu servidor, mas o que colocar para Object state
?
E segundo, assim que eu ClientConnectionManager
eu posso ligar getConnection(long timeout, TimeUnit tunit)
. Mas então, a partir daí, como eu executo meu HttpGet httpRequest = new HttpGet(URL_TO_FILE);
Como eu fiz antes com HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
?
Eu passei pela documentação e tentei algumas coisas diferentes, mas não consegui obter uma solução de trabalho. Portanto, para sugestões e/ou exemplos de código são mais que bem -vindos.
Solução
Você só precisa ligar httpRequest.abort()
e a conexão deve ser fechada.
Com um arquivo grande, você deve ter um processo de loop dos dados. Você pode simplesmente verificar o status de cancelar e abortar a partir daí,
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
while (instream.read(buf) >= 0) {
if (cancelled)
httpRequest.abort();
// Process the file
}
}
Quando o pool ou o Keepalive é usado, a conexão abortada não pode ser devolvida à piscina e deve ser fechada. Houve um bug nas versões mais antigas de que a conexão é mantida viva e atrapalha a próxima solicitação. Eu acho que tudo isso é fixo.