为了账号安全,请及时绑定邮箱和手机立即绑定

在给定的秒数后中断 HTTP 请求

在给定的秒数后中断 HTTP 请求

一只名叫tom的猫 2022-09-28 16:40:24
我使用Java 1.8,删除向导1.3.5和摇摆不定的词形变化1.0.13作为我的API。我有一个方法,它接受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;}假设我想返回一个 400 状态代码,如果操作(在本例中为 20 秒)花费的时间超过 15 秒。我将如何实现这一点?
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

无需其他库即可执行此操作的一种方法是使用包。取消像这样长时间运行的任务的最可靠方法是在单独的线程中运行它。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


查看完整回答
反对 回复 2022-09-28
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

你可以使用像谷歌番石榴库中的时间限制器这样的东西。这允许您将可调用项包装在可使用超时调用的操作中。如果可调用对象没有及时完成操作,它将抛出您可以捕获并返回 400 响应的 a。TimeoutException


例如:


TimeLimiter timeLimiter = new SimpleTimeLimiter();

try {

  String result = timeLimiter.callWithTimeout(

                () -> doSomeHeavyWeightOperation(), 15, TimeUnit.SECONDS);

} catch (TimeoutException e) {

  // return 400

}


查看完整回答
反对 回复 2022-09-28
  • 2 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信