我尝试使用Unirest.get(...).asObjectAsync(...)
使用计划任务更新资源。要停止使用Unirest的程序,您需要调用Unirest.shutdown();
以退出其事件循环和客户端。但是,如果某些线程在成功关闭后调用Unirest的请求方法,则程序无法退出。
以下代码是一个非常简单的示例:我启动一个在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();
}
}
我期望的是这些案件中的任何一个:
我得到了什么:
如何处理Unirest的优雅退出?我应该重组该计划(如果是,如何)?
我在Windows上使用Java 8,在IntelliJ Idea 14.1.5中运行代码。 我使用的最不依赖的依赖是:
<dependency>
<groupId>com.mashape.unirest</groupId>
<artifactId>unirest-java</artifactId>
<version>1.4.7</version>
</dependency>
答案 0 :(得分:1)
在您的情况下,您生成了一个运行异步调用的线程。 shutdown()
调用在您的主线程中,因此在调用线程生成时,{<1}}将被称为,之后 Unirest的shutdown()
方法可以第一次打电话。
第一次调用asStringAsync()
实例化最终需要关闭的线程池 - 在调用shutdown方法时没有什么可以关闭的,所以它是一个无操作。它将在您创建的主题中实例化。
此处的解决方案是删除您创建的线程,并使用Unirest为您提供的..Async()
对象。当您执行异步调用时,Unirest会处理线程,您可以根据需要输入回调逻辑。
Future
答案 1 :(得分:0)
asyncCall.get()将阻止该呼叫,因此最好执行以下操作:
asyncCall.thenAcceptAsync((result)->{
if (null != result && !result.isEmpty()) {
// do your business logic after response and then close Unirest
Unirest.shutdown();
}
});
}
但是在清理资源的情况下,您始终可以重复使用相同创建的资源并注册一个关闭钩子,该钩子将在JVM关闭期间清除所有内容。