簡體   English   中英

如何在Java函數調用上設置超時,並在超時結束后終止其執行?

[英]How to set a timeout on a java function call, and kill its execution once timeout is over?

我嘗試使用Callable選項在函數調用上設置超時,同時在Spring Boot的配置文件(spring.mvc.async.request-timeout)中設置超時持續時間。

設置超時后,代碼確實返回,但是問題在於函數本身繼續執行。

我無法訪問該函數的源代碼,因為它是第三方libaray,所以我沒有辦法在該代碼中設置中斷檢查。

一旦超時結束,是否有辦法強制終止函數/線程? 我在這里使用了錯誤的路徑嗎,還有沒有其他方法可以實現這個目標?

當前代碼的一個示例,它在超時后“返回”,但並沒有真正停止在后台執行該代碼:

@RequestMapping(value = "/api/test", method = RequestMethod.POST, produces = "application/json")
    public Callable<ResponseEntity<String>> test(@RequestParam(...) Boolean bbb) {
        return new Callable<ResponseEntity<String>>() {
            @Override
            public ResponseEntity<String> call() throws Exception {
                try {
                    <POTENTIALLY LONG 3RD-PARTY FUNCTION CALL HERE>
                    .....
                } catch (Exception e) {
                    return new ResponseEntity<String>("..." }", HttpStatus.BAD_REQUEST);
                }
            }
        };
    }

謝謝。

最后,要實現超時,您需要查看多個線程一起工作。 Java線程的問題是:您不應該殺死它們。 例如,請參見此處: 如何殺死Java中的線程?

換句話說:如果您打算真正控制第三方代碼並能夠殺死它,則線程將無法執行。 您可以嘗試看看使用thread.stop()是否對您足夠“可靠”。 當然,您可以看到中斷運行您的方法的線程是如何導致的。 您絕對必須直接使用裸金屬線。

如果所有這些都失敗了……肯定會起作用:在自己的專用jvm中運行該函數調用! 您可以隨時殺死一個子進程。

當然,缺點是:現在您需要擔心進程內通信以及如何將數據獲取到該函數並從中獲取數據!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM