HTTP 請求生命週期
必要相依性:io.ktor:ktor-server-core
程式碼範例: server-http-request-lifecycle
支援的引擎:Netty, CIO
預設情況下,即使用戶端斷開連線,Ktor 仍會繼續處理請求。 HttpRequestLifecycle 外掛程式可讓您在用戶端斷開連線時立即取消請求處理。
這對於長時間執行或資源密集型的請求非常有用,因為當用戶端不再等待回應時,這些請求應該停止執行。
安裝與設定 HttpRequestLifecycle
要啟用 HttpRequestLifecycle 外掛程式,請在您的應用程式模組中使用 install 函式進行安裝,並設定 cancelCallOnClose 屬性:
import io.ktor.server.application.*
import io.ktor.server.http.HttpRequestLifecycle
fun Application.module() {
install(HttpRequestLifecycle) {
cancelCallOnClose = true
}
}當 cancelCallOnClose 屬性啟用時,HttpRequestLifecycle 外掛程式會為每個請求安裝一個取消處理常式。當用戶端斷開連線時,只有處理該特定路由的協同程式會被取消。
取消會透過結構化並行進行傳遞,因此從請求協同程式啟動的所有子協同程式(例如:使用 launch 或 async)也會被取消。在下一個暫停點會拋出 CancellationException。
處理取消
您可以捕捉 CancellationException 來執行清理作業,例如釋放資源或停止背景工作:
fun Application.module() {
install(HttpRequestLifecycle) {
cancelCallOnClose = true
}
routing {
get("/long-process") {
try {
while (isActive) {
delay(10_000)
log.info("Very important work.")
}
call.respond("Completed")
} catch (e: CancellationException) {
log.info("Cleaning up resources.")
}
}
}
}協同程式取消是協作式的。阻塞或 CPU 密集型程式碼不會自動中斷。 如果請求處理執行長時間運行的工作,請呼叫
call.coroutineContext.ensureActive()以回應取消。若要了解更多,請參閱 協同程式取消。
如需完整範例,請參閱 server-http-request-lifecycle。
限制
此外掛程式僅在 CIO 和 Netty 引擎上受到完整支援。基於 servlet 的引擎(或其他不支援的引擎)無法可靠地偵測用戶端斷開連線。取消只能在伺服器嘗試寫入回應時被偵測到。
