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

我使用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 秒。我将如何实现这一点?


一只名叫tom的猫
浏览 76回答 2
2回答

慕容森

无需其他库即可执行此操作的一种方法是使用包。取消像这样长时间运行的任务的最可靠方法是在单独的线程中运行它。java.util.concurrentimport java.util.concurrent.*;...private ExecutorService exec = Executors.newSingleThreadExecutor();public ResponseContext delayBy20Seconds(RequestContext context) {&nbsp; &nbsp; Callable<ResponseContext> task = new Callable<ResponseContext>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public ResponseContext call() throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Thread.sleep(20000);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new ResponseContext().contentType(MediaType.APPLICATION_JSON_TYPE);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };&nbsp; &nbsp; List<Callable<ResponseContext>> tasks = new ArrayList<>();&nbsp; &nbsp; tasks.add(task);&nbsp; &nbsp; List<Future<ResponseContext>> done = exec.invokeAll(tasks, 15, TimeUnit.SECONDS);&nbsp; &nbsp; Future<ResponseContext> task1 = done.get(0);&nbsp; &nbsp; if (task1.isCancelled()) {&nbsp; &nbsp; &nbsp; &nbsp; return some Error Response;&nbsp; &nbsp; }&nbsp; &nbsp; return task1.get();}您不应该是静态的,因为您不希望在此特定用途的线程之间共享它。ExecutorService实现是完成长时间运行的任务的工作的地方。在电话中应该很明显,我们告诉它我们愿意等待多少。返回的期货列表将始终包含与任务列表一样多的元素,因此无需检查其空虚。我们只需要检查任务是否完成。Callable<ResponseContext>exec.invokeAll

红颜莎娜

你可以使用像谷歌番石榴库中的时间限制器这样的东西。这允许您将可调用项包装在可使用超时调用的操作中。如果可调用对象没有及时完成操作,它将抛出您可以捕获并返回 400 响应的 a。TimeoutException例如:TimeLimiter timeLimiter = new SimpleTimeLimiter();try {&nbsp; String result = timeLimiter.callWithTimeout(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; () -> doSomeHeavyWeightOperation(), 15, TimeUnit.SECONDS);} catch (TimeoutException e) {&nbsp; // return 400}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java