unirest shutdown 退出程序
Unirest shutdown to exit program
我尝试使用 Unirest.get(...).asObjectAsync(...)
使用计划任务更新资源。要停止使用 Unirest 的程序,您需要调用 Unirest.shutdown();
退出其事件循环和客户端。但是如果关闭成功后有线程调用了Unirest的request方法,程序无法退出。
下面的代码是一个非常简单的示例:我启动了一个线程,该线程在 1.5 秒后执行 GET 请求,并在成功时打印状态消息。同时在主线程上,Unirest 被关闭。 (请注意,为了简单起见,该示例使用 asStringAsync(...)
和一个非常简单的线程。)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.async.Callback;
import com.mashape.unirest.http.exceptions.UnirestException;
import java.io.IOException;
public class Main {
public static void main(String... args) throws IOException, InterruptedException {
new Thread(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Unirest.get("http://example.org").asStringAsync(new Callback<String>() {
@Override
public void completed(HttpResponse<String> response) {
System.out.println(response.getStatusText());
}
@Override
public void failed(UnirestException e) {
System.out.println("failed");
}
@Override
public void cancelled() {
System.out.println("cancelled");
}
});
}).start();
Unirest.shutdown();
}
}
我预期的是以下任何一种情况:
- 程序关闭,没有输出。
- 程序关闭,我得到以下任何输出:状态消息,失败或已取消。
- 程序关闭但抛出异常,因为GET请求发生时Unirest已经关闭
我得到的:
- 程序没有关闭,GET请求成功,打印"OK"。
如何处理 Unirest 的正常退出?我是否应该重组程序(如果是,如何)?
我在 Windows 上使用 Java 8,运行 IntelliJ Idea 14.1.5 中的代码。
我使用的 unirest 依赖是:
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.7</version>
</dependency>
在您的例子中,您生成了一个运行异步调用的线程。 shutdown()
调用在您的主线程中,因此在调用线程产生时,shutdown()
将在 方法 之前被调用 shutdown()
可以先调用 Unirest 的。
这是对实例化最终需要关闭的线程池的 ..Async()
的第一次调用 - 在您调用关闭方法时没有任何东西可以关闭,因此它是一个空操作。它将在您创建的线程中实例化。
此处的解决方案是删除您创建的线程,并使用 Unirest 为您提供的 Future
对象。当您进行异步调用时,Unirest 会自行处理线程,您可以根据需要输入回调逻辑。
public static void main(String... args) throws IOException, InterruptedException, ExecutionException {
Future<HttpResponse<String>> asyncCall = Unirest.get("http://thecatapi.com/api/images/get?format=xml&results_per_page=20").asStringAsync(new Callback<String>() {
@Override
public void completed(HttpResponse<String> response) {
System.out.println(response.getStatusText());
}
@Override
public void failed(UnirestException e) {
System.out.println("failed");
}
@Override
public void cancelled() {
System.out.println("cancelled");
}
});
HttpResponse<String> httpResponse = asyncCall.get(); // Can also use Future.isDone(), etc
// System.out.println(httpResponse.getBody());
Unirest.shutdown();
}
asyncCall.get() 会阻塞调用,所以最好按如下方式做:
asyncCall.thenAcceptAsync((result)->{
if (null != result && !result.isEmpty()) {
// do your business logic after response and then close Unirest
Unirest.shutdown();
}
});
}
但是在清理资源的情况下,您始终可以重复使用相同的创建资源并注册一个关闭挂钩,它将在 JVM 关闭期间清理所有内容。
我尝试使用 Unirest.get(...).asObjectAsync(...)
使用计划任务更新资源。要停止使用 Unirest 的程序,您需要调用 Unirest.shutdown();
退出其事件循环和客户端。但是如果关闭成功后有线程调用了Unirest的request方法,程序无法退出。
下面的代码是一个非常简单的示例:我启动了一个线程,该线程在 1.5 秒后执行 GET 请求,并在成功时打印状态消息。同时在主线程上,Unirest 被关闭。 (请注意,为了简单起见,该示例使用 asStringAsync(...)
和一个非常简单的线程。)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.async.Callback;
import com.mashape.unirest.http.exceptions.UnirestException;
import java.io.IOException;
public class Main {
public static void main(String... args) throws IOException, InterruptedException {
new Thread(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
Unirest.get("http://example.org").asStringAsync(new Callback<String>() {
@Override
public void completed(HttpResponse<String> response) {
System.out.println(response.getStatusText());
}
@Override
public void failed(UnirestException e) {
System.out.println("failed");
}
@Override
public void cancelled() {
System.out.println("cancelled");
}
});
}).start();
Unirest.shutdown();
}
}
我预期的是以下任何一种情况:
- 程序关闭,没有输出。
- 程序关闭,我得到以下任何输出:状态消息,失败或已取消。
- 程序关闭但抛出异常,因为GET请求发生时Unirest已经关闭
我得到的:
- 程序没有关闭,GET请求成功,打印"OK"。
如何处理 Unirest 的正常退出?我是否应该重组程序(如果是,如何)?
我在 Windows 上使用 Java 8,运行 IntelliJ Idea 14.1.5 中的代码。 我使用的 unirest 依赖是:
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.7</version>
</dependency>
在您的例子中,您生成了一个运行异步调用的线程。 shutdown()
调用在您的主线程中,因此在调用线程产生时,shutdown()
将在 方法 之前被调用 shutdown()
可以先调用 Unirest 的。
这是对实例化最终需要关闭的线程池的 ..Async()
的第一次调用 - 在您调用关闭方法时没有任何东西可以关闭,因此它是一个空操作。它将在您创建的线程中实例化。
此处的解决方案是删除您创建的线程,并使用 Unirest 为您提供的 Future
对象。当您进行异步调用时,Unirest 会自行处理线程,您可以根据需要输入回调逻辑。
public static void main(String... args) throws IOException, InterruptedException, ExecutionException {
Future<HttpResponse<String>> asyncCall = Unirest.get("http://thecatapi.com/api/images/get?format=xml&results_per_page=20").asStringAsync(new Callback<String>() {
@Override
public void completed(HttpResponse<String> response) {
System.out.println(response.getStatusText());
}
@Override
public void failed(UnirestException e) {
System.out.println("failed");
}
@Override
public void cancelled() {
System.out.println("cancelled");
}
});
HttpResponse<String> httpResponse = asyncCall.get(); // Can also use Future.isDone(), etc
// System.out.println(httpResponse.getBody());
Unirest.shutdown();
}
asyncCall.get() 会阻塞调用,所以最好按如下方式做:
asyncCall.thenAcceptAsync((result)->{
if (null != result && !result.isEmpty()) {
// do your business logic after response and then close Unirest
Unirest.shutdown();
}
});
}
但是在清理资源的情况下,您始终可以重复使用相同的创建资源并注册一个关闭挂钩,它将在 JVM 关闭期间清理所有内容。