Unirest shutdown退出程序

时间:2015-09-30 18:18:36

标签: java unirest

我尝试使用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();
    }
}

我期望的是这些案件中的任何一个:

  • 程序关闭,没有输出。
  • 程序关闭,我得到任何这些输出:状态消息,失败或取消。
  • 程序关闭但引发异常,因为在发出GET请求时Unirest已经关闭。

我得到了什么:

  • 程序没有关闭,GET请求成功,打印“OK”。

如何处理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>

2 个答案:

答案 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关闭期间清除所有内容。

参考:http://kong.github.io/unirest-java/#configuration