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條經驗 獲得超13個贊
你可以使用像谷歌番石榴庫中的時間限制器這樣的東西。這允許您將可調用項包裝在可使用超時調用的操作中。如果可調用對象沒有及時完成操作,它將拋出您可以捕獲并返回 400 響應的 a。TimeoutException
例如:
TimeLimiter timeLimiter = new SimpleTimeLimiter();
try {
String result = timeLimiter.callWithTimeout(
() -> doSomeHeavyWeightOperation(), 15, TimeUnit.SECONDS);
} catch (TimeoutException e) {
// return 400
}
添加回答
舉報