当前位置: 首页 > 知识库问答 >
问题:

从try资源结构返回未来

关胜
2023-03-14

我有下面的方法,它使用Apache Commons Http客户机向给定的URI发送异步GET,并返回Future和响应。

CloseableHttpAsyncClient实现了Closeable,因此我使用try/resource结构。

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);
    }

下面您可以看到其用法:

Future<HttpResponse> future = sendAsyncGet("http://www.apache.org");
future.get(3, TimeUnit.SECONDS);

问题是,当我调用get on a future时,它不会返回所需的HttpResponse。如果我使用重载的get()方法,它将一直等待,直到超过超时或永远。我想这是因为try/resource没有正确发布。

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

更新:

这是maven依赖性:

   <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpasyncclient</artifactId>
        <version>4.1.1</version>
        <scope>test</scope>
    </dependency>

共有1个答案

赵禄
2023-03-14

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

您可能希望通过将来传递给执行调用的回调来关闭异步客户端。

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");
        }
    });
}
 类似资料:
  • 我试图在JPanel上显示图片,但一直出现错误: Java语言lang.IllegalArgumentException:input==null! 我不明白发生了什么。 这是我正在使用的代码: 这只会导致我得到错误! 堆栈跟踪产生以下结果: 我如何解决这个问题?我已经检查了图像的位置,并且从不同的位置尝试,总是得到相同的错误! 我正在使用Netbean IDE。

  • 这很奇怪,因为我有这样的路由:,它根本不工作,它不断返回

  • 我实现了一个try-catch块。 我试图用一种特定的方式实现捕捉块,但是它不太好用。如果输入不是整数,它应该重复并返回到try块。它只工作一次,但更多。 你能给我一些帮助吗?非常感谢。

  • 考虑来自Java文档的以下代码。 根据Java文档, 在示例readFirstLineFromFile中,如果从try块和try with resources语句抛出异常,则方法readFirstLineFromFile抛出从try块抛出的异常;禁止从try with resources块引发的异常。 另一方面,也提到了 由于BufferedReader实例是在try with resource语

  • 问题内容: 我已经搜索了可能的解决方案。并且我尝试了循环以及mysql_fetch_assoc和mysql_fetch_array的变体,但我仍然遇到资源ID#5:0:错误。 这是我认为会产生错误的代码。 问题答案: “资源ID#5:0”不是错误。这意味着您试图而不是尝试使用变量,例如对于fetch_assoc 使用$ row [column],对于fetch_row使用$ row [0],对于f