如何使用 Unirest 并行发送多个异步请求
How to send multiple asynchronous requests in parallel using Unirest
在使用 Unirest 时,程序不会退出,直到我们通过调用 Unirest.shutdown()
手动关闭每个线程。如果我只需要提出一个请求,那很简单:
private static void asyncRequest (String link) {
try {
Future <HttpResponse <JsonNode>> request = Unirest.head(link).asJsonAsync(
new Callback<JsonNode>() {
@Override
public void completed(HttpResponse<JsonNode> httpResponse) {
print(httpResponse.getHeaders());
try {
Unirest.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void failed(UnirestException e) {
print(e.getMessage());
}
@Override
public void cancelled() {
print("Request cancelled");
}
}
);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
asyncRequest("https://entrepreneur.com");
}
但我必须并行发出多个 HTTP 请求(后续请求意味着不要等待先前的请求完成)。在上面的代码中,我必须使用不同的 link
多次执行 asyncRequest
中的代码。问题是我无法决定何时调用 Unirest.shutdown()
以便程序在最后一个请求收到响应后立即退出。如果我在 main
中对 asyncRequest
的所有调用之后调用 Unirest.shutdown()
,部分或所有请求可能会被中断。如果我在 completed
(和其他覆盖的方法)中调用它,则只会发出第一个请求,其他请求会被中断。我该如何解决这个问题?
理论上,你可以让当前线程等待该方法的执行,当它们都完成后,你可以调用关闭。但这会使整个过程同步,这不是我们想要的。所以我要做的是,运行 个不同的线程(主线程除外)将等待所有 http 请求的执行。为此,您可以使用 class CountDownLatch
,在将控制权释放给父线程之前使用倒计时进行初始化。您将 CountDownLatch
的实例传递给 async
方法,并在每次完成 http 请求时减少 by one
。当它达到 0 时,它 returns 控制父线程,您知道您可以在完成所有请求时调用 shutdown
方法。
在使用 Unirest 时,程序不会退出,直到我们通过调用 Unirest.shutdown()
手动关闭每个线程。如果我只需要提出一个请求,那很简单:
private static void asyncRequest (String link) {
try {
Future <HttpResponse <JsonNode>> request = Unirest.head(link).asJsonAsync(
new Callback<JsonNode>() {
@Override
public void completed(HttpResponse<JsonNode> httpResponse) {
print(httpResponse.getHeaders());
try {
Unirest.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void failed(UnirestException e) {
print(e.getMessage());
}
@Override
public void cancelled() {
print("Request cancelled");
}
}
);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
asyncRequest("https://entrepreneur.com");
}
但我必须并行发出多个 HTTP 请求(后续请求意味着不要等待先前的请求完成)。在上面的代码中,我必须使用不同的 link
多次执行 asyncRequest
中的代码。问题是我无法决定何时调用 Unirest.shutdown()
以便程序在最后一个请求收到响应后立即退出。如果我在 main
中对 asyncRequest
的所有调用之后调用 Unirest.shutdown()
,部分或所有请求可能会被中断。如果我在 completed
(和其他覆盖的方法)中调用它,则只会发出第一个请求,其他请求会被中断。我该如何解决这个问题?
理论上,你可以让当前线程等待该方法的执行,当它们都完成后,你可以调用关闭。但这会使整个过程同步,这不是我们想要的。所以我要做的是,运行 个不同的线程(主线程除外)将等待所有 http 请求的执行。为此,您可以使用 class CountDownLatch
,在将控制权释放给父线程之前使用倒计时进行初始化。您将 CountDownLatch
的实例传递给 async
方法,并在每次完成 http 请求时减少 by one
。当它达到 0 时,它 returns 控制父线程,您知道您可以在完成所有请求时调用 shutdown
方法。