gpt4 book ai didi

java - 如何从回调中获取 guava ListenableFuture?

转载 作者:行者123 更新时间:2023-12-02 11:50:01 29 4
gpt4 key购买 nike

我想使用 apache 异步 http 客户端进行异步 http 调用,以便每个线程运行多个调用。

此处列出了代码:https://hc.apache.org/httpcomponents-asyncclient-dev/quickstart.html

CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();

// Start the client
httpclient.start();

// One most likely would want to use a callback for operation result
final CountDownLatch latch1 = new CountDownLatch(1);
final HttpGet request2 = new HttpGet("http://www.apache.org/");
httpclient.execute(request2, new FutureCallback<HttpResponse>() {

public void completed(final HttpResponse response2) {
latch1.countDown();
System.out.println(request2.getRequestLine() + "->" + response2.getStatusLine());
}

public void failed(final Exception ex) {
latch1.countDown();
System.out.println(request2.getRequestLine() + "->" + ex);
}

public void cancelled() {
latch1.countDown();
System.out.println(request2.getRequestLine() + " cancelled");
}

});
latch1.await();

上次我在 Nodejs 中编程,并对 Promise 方法感到非常满意。我发现的最接近的项目是 GUAVA 的 ListenableFuture。 (我不能使用 Java 8)。问题是如何将回调方式转换为ListenableFuture。

在nodejs中这很容易,因为在回调中我可以只调用解析函数。我不知道如何在 Java 中执行此操作,并且在 google 中没有找到如何执行此操作。

最佳答案

正如 API 所说,execute 方法返回一个 Future。由于它链接到回调,因此它应该是 ListenableFuture 所以

ListenableFuture<HttpResponse> future = (ListenableFuture<HttpResponse>) httpclient.execute(...);

应该可以解决这个问题(在回调内部,你不能这样做)。从技术上讲,您甚至不需要转换 Future,因为正常的 Future 应该足以满足您的用例,因为您不需要更多回调(如果我明白的话)。

如果您想完全摆脱回调(这将是不太困惑的解决方案),您需要使用 HttpClient 的另一个实现,但这需要重写代码。

但是在回调内部,您无法获取 future,而且您也不需要它,因为 future 的结果是回调的参数。

关于java - 如何从回调中获取 guava ListenableFuture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47959148/

29 4 0