我有一个用akka-http编写的REST服务,它暴露了一个 / fire 端点。当调用该端点时,我的服务应该向不同的服务发送一个通常约为50MB的文件。但是 / fire 端点应该立即返回给调用者并继续异步发送文件,这是一种“一劳永逸”的方式。
我的实现看起来像这样
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中 sendFile 保证在成功/失败完成之前运行,否则会出现运行它的线程被杀死的情况?
答案 0 :(得分:4)
这可能取决于您正在运行Future对抗的执行上下文。
如果您正在使用全局ExecutionContext,则行为是在请求完成后保持Future运行。
据我所知,在请求完成的情况下,我从未见过任何会杀死/中断/取消Future线程的ExecutionContext。请求完成的概念在语言级别不存在,但与您的http层框架更相关,因此只要您不使用来自http层框架的ExecutionContext,就没有理由有这样的行为。