我使用嵌入式Jetty來託管WEB服務器。請求被轉發(通過我的內部實現)從動態加載的JAR中進行編碼。有時候我需要熱更新內存JAR,爲此我等待請求完成,但可能會發生這種情況,要麼是因爲編程錯誤,要麼是因爲實際的長時間運行等待超出了合理的時間。如何正常取消嵌入式Jetty中的死鎖WEB請求
我想取消一些超時後處理WEB請求。
在這種情況下,Jetty(v.8 +)可以做什麼?
附註:我知道線程上的Thread.stop()與卡住WEB請求,它似乎不是一個好方法。
我使用嵌入式Jetty來託管WEB服務器。請求被轉發(通過我的內部實現)從動態加載的JAR中進行編碼。有時候我需要熱更新內存JAR,爲此我等待請求完成,但可能會發生這種情況,要麼是因爲編程錯誤,要麼是因爲實際的長時間運行等待超出了合理的時間。如何正常取消嵌入式Jetty中的死鎖WEB請求
我想取消一些超時後處理WEB請求。
在這種情況下,Jetty(v.8 +)可以做什麼?
附註:我知道線程上的Thread.stop()與卡住WEB請求,它似乎不是一個好方法。
您可以編寫一個Jetty HandlerWrapper
,它使用ScheduledExecutorService
中斷請求線程,如果請求線程在一段時間後還沒有完成。見這裏的一個例子:
中斷請求線程是*危險*而不是一個有效的解決方案(你會導致內部狀態問題) –
請求的唯一有效的消除是通過終止連接和/或端點。
這通常(並且很容易)通過空閒超時完成。
對於熱插拔jar,關閉(或停止)連接器,等待所有的請求/連接空閒超時,交換你的罐子,然後重新啓動連接器。
似乎是一個不錯的選擇,除了請求處理代碼只是停留在無限循環而不發送任何內容的情況。 –
與任何取消邏輯一樣,您需要決定如何處理取消操作。這包括您提供取消消息的方式,以及在取消時如何處理。畢竟,「優雅」本質上是一個主觀的術語。至於死鎖看看http://stackoverflow.com/questions/1849972/how-to-kill-deadlocked-threads-in-java –