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
TA贡献1842条经验 获得超12个赞
你可以使用像谷歌番石榴库中的时间限制器这样的东西。这允许您将可调用项包装在可使用超时调用的操作中。如果可调用对象没有及时完成操作,它将抛出您可以捕获并返回 400 响应的 a。TimeoutException
例如:
TimeLimiter timeLimiter = new SimpleTimeLimiter();
try {
String result = timeLimiter.callWithTimeout(
() -> doSomeHeavyWeightOperation(), 15, TimeUnit.SECONDS);
} catch (TimeoutException e) {
// return 400
}
添加回答
举报