首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从资源结构看未来的回归

从资源结构看未来的回归
EN

Stack Overflow用户
提问于 2016-03-12 18:02:31
回答 1查看 1.2K关注 0票数 1

我有以下方法,它使用Apache客户端将异步GET发送到给定的URI,并通过响应返回Future。

CloseableHttpAsyncClient实现了关闭,因此我使用了try/resource。

代码语言:javascript
代码运行次数:0
运行
复制
public static Future<HttpResponse> sendAsyncGet(String uri) throws IOException {
    try (CloseableHttpAsyncClient asyncHttpClient = HttpAsyncClients.createDefault()) {
        asyncHttpClient.start();
        HttpGet httpGet = new HttpGet(uri);
        return asyncHttpClient.execute(httpGet, null);
    }

下面您可以看到使用情况:

代码语言:javascript
代码运行次数:0
运行
复制
Future<HttpResponse> future = sendAsyncGet("http://www.apache.org");
future.get(3, TimeUnit.SECONDS);

问题是,当我调用get时,它不会返回所需的HttpResponse。如果我使用重载的get()方法,它将等待超时,或者永远等待。我想这是因为try/resource没有被正确地释放。

如何改进给定的方法/代码以使其能够正确使用:具有方法主体中包含的try/资源结构的未来?

更新:

这是maven依赖关系:

代码语言:javascript
代码运行次数:0
运行
复制
   <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpasyncclient</artifactId>
        <version>4.1.1</version>
        <scope>test</scope>
    </dependency>
EN

回答 1

Stack Overflow用户

发布于 2016-03-12 20:08:30

在收到响应之前,使用资源尝试将关闭异步客户端。

您可能希望从传递给execute调用的将来回调中关闭异步客户机。

代码语言:javascript
代码运行次数:0
运行
复制
public static Future<HttpResponse> sendAsyncGet(String uri) throws IOException {
    final CloseableHttpAsyncClient asyncHttpClient;

    asyncHttpClient = HttpAsyncClients.createDefault();
    asyncHttpClient.start();

    return asyncHttpClient.execute(new HttpGet(uri), new FutureCallback<HttpResponse>() {
        private void close() {
            try {
                asyncHttpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void completed(HttpResponse response) {
            close();
            System.out.println("completed");
        }

        @Override
        public void failed(Exception e) {
            close();
            e.printStackTrace();
        }

        @Override
        public void cancelled() {
            close();
            System.out.println("cancelled");
        }
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35961356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档