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

标签 java swagger

我为我的 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/

相关文章:

java - Git 存储库克隆失败。缺少 CR

java - 在android studio中创建新项目后"IDE error occurred"

java - 如何在 Swagger 中添加有关 API 的更多信息?

spring-mvc - 如何为 Swagger 注释嵌套 Java 类?

asp.net-core - ASP.Net Core Swagger如何忽略默认参数值

c# - 使用 ServiceStack 的 Swagger UI 传递 header

Java 8 Stream API 收集器问题

java - 配置 drools 和 maven 并使用它们编写 hello world 应用程序

java - java中动态创建对象

swagger - 如何将多个 OpenAPI 3 规范文件组合在一起?