2 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
無需其他庫即可執(zhí)行此操作的一種方法是使用包。取消像這樣長時(shí)間運(yùn)行的任務(wù)的最可靠方法是在單獨(dú)的線程中運(yùn)行它。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();
}
您不應(yīng)該是靜態(tài)的,因?yàn)槟幌M诖颂囟ㄓ猛镜木€程之間共享它。ExecutorService
實(shí)現(xiàn)是完成長時(shí)間運(yùn)行的任務(wù)的工作的地方。在電話中應(yīng)該很明顯,我們告訴它我們?cè)敢獾却嗌佟7祷氐钠谪浟斜韺⑹冀K包含與任務(wù)列表一樣多的元素,因此無需檢查其空虛。我們只需要檢查任務(wù)是否完成。Callable<ResponseContext>exec.invokeAll

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
你可以使用像谷歌番石榴庫中的時(shí)間限制器這樣的東西。這允許您將可調(diào)用項(xiàng)包裝在可使用超時(shí)調(diào)用的操作中。如果可調(diào)用對(duì)象沒有及時(shí)完成操作,它將拋出您可以捕獲并返回 400 響應(yīng)的 a。TimeoutException
例如:
TimeLimiter timeLimiter = new SimpleTimeLimiter();
try {
String result = timeLimiter.callWithTimeout(
() -> doSomeHeavyWeightOperation(), 15, TimeUnit.SECONDS);
} catch (TimeoutException e) {
// return 400
}
添加回答
舉報(bào)