2016-11-10 75 views
3

我已經寫在阿卡-HTTP REST服務暴露一個/火端點。當該端點被調用時,我的服務應該發送一個文件,通常爲〜50MB到不同的服務。但是,端點應該立即返回給調用者,並且繼續以異常方式發送文件。scala期貨在akka-http的迴應後繼續運行嗎?

我的實現看起來像這樣

path("fire") { 
    post { request: FireRequest => 
     complete { 
     sendFile(request.path) 
     StatusCodes.OK 
     } 
    } 
    } 
} 

def sendFile(path: String): Future[Unit] = Future { 
    // send the large file to another service 
} 
我測試了它

,它工作正常。

但是,當使用ASP.NET實現類似的行爲時,我需要使用第三方框架(Hangfire)來處理異步任務,因爲完成的請求生成的線程最終會被終止。

我的問題是:在我的akka​​-http 發送文件保證運行,直到成功/失敗的完成,否則會出現它運行的線程將被殺死的情況?

回答

4

這可能取決於你對運行你的未來的ExecutionContext。

如果您使用的是全球的ExecutionContext,行爲是保持未來甚至請求完成後運行。

據我所知,我從來沒有見過那會殺/中斷/取消未來線程請求完成的情況下,任何的ExecutionContext。請求完成的概念在語言層面不存在,但與您的http層框架更相關,所以只要您不使用來自http層框架的ExecutionContext,就沒有理由產生這樣的行爲。

+0

此外,也沒有故意沒有一個'scala.concurrent.Future',還是我失去了一些東西的概念? – rethab

+0

不確定你失敗的意思。你確實可以將任何成功的未來轉化爲失敗的承諾,並且你可以創造失敗的承諾。有條件地將成功承諾轉化爲失敗的承諾可以在條件下完成,因此您可能能夠實現某種「未來取消」(但是,這種取消是有限的,並且會將成功轉化爲當前承諾的失敗,它不會傳播回「資源」) –