取消/中断来自ThreadSafeClientConnManager连接池的连接

5
我正在使用ThreadSafeClientConnManager来管理客户端连接池,因为我的应用程序有多个线程同时连接到Web服务器。
抽象示例代码:
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);一样?
我已经阅读了文档并尝试了许多不同的方法,但我无法获得一个可行的解决方案。因此,任何建议和/或代码示例都将不胜感激。
1个回答

5

您只需要调用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
        }
     }

当使用连接池或长连接时,中断的连接无法返回到连接池中,必须关闭。在旧版本中存在一个错误,即连接保持活动状态,会影响下一个请求。我认为这个问题已经得到解决。


谢谢。这比我尝试做的要容易得多;-)在abort()之后,连接不再在netstat中显示。我认为它已经关闭了。 - znq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接