对 Java 操作应用超时控制

2022-09-02 21:20:54

我正在使用第三方Java库与REST API进行交互。REST API 有时可能需要很长时间才能响应,最终导致抛出。java.net.ConnectException

我想缩短超时期限,但无法修改第三方库。

我想围绕Java方法的调用应用某种形式的超时控制,以便我可以确定在什么时候放弃等待。

这与网络超时没有直接关系。我希望能够尝试执行操作,并能够在指定的等待时间后放弃。

以下内容绝不是有效的Java,但在概念上确实证明了我想要实现的目标:

try {
    Entity entity = new Entity();
    entity.methodThatMakesUseOfRestApi();
} catch (<it's been ages now, I don't want to wait any longer>) {
    throw TimeoutException();
}

答案 1

我推荐来自谷歌番石榴图书馆的TimeLimiter


答案 2

这可能是目前使用普通Java应该如何做到这一点的方式:

public String getResult(final RESTService restService, String url) throws TimeoutException {
    // should be a field, not a local variable
    ExecutorService threadPool = Executors.newCachedThreadPool();

    // Java 8:
    Callable<String> callable = () -> restService.getResult(url);

    // Java 7:
    // Callable<String> callable = new Callable<String>() {
    //     @Override
    //     public String call() throws Exception {
    //         return restService.getResult(url);
    //     }
    // };

    Future<String> future = threadPool.submit(callable);
    try {
        // throws a TimeoutException after 1000 ms
        return future.get(1000, TimeUnit.MILLISECONDS);
    } catch (ExecutionException e) {
        throw new RuntimeException(e.getCause());
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new TimeoutException();
    }
}

推荐