我有一个用 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 发送文件 保证运行直到成功/失败完成,还是会出现运行它的线程将被杀死的情况?
最佳答案
这可能取决于您运行 Future 的 ExecutionContext。
如果您使用全局 ExecutionContext,则行为是即使在请求完成后也保持 Future 运行。
据我所知,我从未见过任何 ExecutionContext 会在请求完成的情况下杀死/中断/取消 Future 线程。请求完成的概念在语言级别不存在,但与您的 http 层框架更相关,因此只要您不使用 http 层框架中的 ExecutionContext,就没有理由有这样的行为。
关于scala - 在 akka-http 响应后,Scala future 是否继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537738/