亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在給定的秒數后中斷 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條經驗 獲得超13個贊

你可以使用像谷歌番石榴庫中的時間限制器這樣的東西。這允許您將可調用項包裝在可使用超時調用的操作中。如果可調用對象沒有及時完成操作,它將拋出您可以捕獲并返回 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 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號