2016-11-10 76 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

不确定你失败的意思。你确实可以将任何成功的未来转化为失败的承诺,并且你可以创造失败的承诺。有条件地将成功承诺转化为失败的承诺可以在条件下完成,因此您可能能够实现某种“未来取消”(但是,这种取消是有限的,并且会将成功转化为当前承诺的失败,它不会传播回“资源”) –