gpt4 book ai didi

java - 在给定秒数后中断 HTTP 请求

转载 作者:搜寻专家 更新时间:2023-11-01 01:39:36 24 4
gpt4 key购买 nike

我为我的 API 使用 Java 1.8、dropwizard 1.3.5 和 swagger inflection 1.0.13。

我有一个方法接受 HTTP 请求,延迟 20 秒,然后返回 200 状态代码响应:

public ResponseContext delayBy20Seconds(RequestContext context) {
ResponseContext response = new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);

Thread.sleep(20000);

response.status(Response.Status.OK);
return response;
}

假设我想在操作(在本例中需要 20 秒)超过 15 秒时返回 400 状态代码。我将如何实现这一目标?

最佳答案

无需额外库的一种方法是使用 java.util.concurrent包裹。取消像这样长时间运行的任务的最可靠方法是在单独的线程中运行它。

import java.util.concurrent.*;

...

private ExecutorService exec = Executors.newSingleThreadExecutor();
public ResponseContext delayBy20Seconds(RequestContext context) {
Callable<ResponseContext> task = new Callable<ResponseContext>() {
@Override
public ResponseContext call() throws Exception {
Thread.sleep(20000);
return new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);
}
};
List<Callable<ResponseContext>> tasks = new ArrayList<>();
tasks.add(task);
List<Future<ResponseContext>> done = exec.invokeAll(tasks, 15, TimeUnit.SECONDS);
Future<ResponseContext> task1 = done.get(0);
if (task1.isCancelled()) {
return some Error Response;
}
return task1.get();
}

你的 ExecutorService不应该是静态的,因为您不想为此特定用途在线程之间共享它。

Callable<ResponseContext>实现是完成长期运行任务的地方。在 exec.invokeAll 中应该很明显打电话告诉它我们愿意等多久。返回的 Futures 列表将始终包含与任务列表一样多的元素,因此无需检查它是否为空。我们只需要检查任务是否完成。

关于java - 在给定秒数后中断 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55609281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com