scala期货在akka-http回复后继续运行吗?

时间:2016-11-10 21:59:32

标签: scala akka spray akka-http fire-and-forget

我有一个用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 保证在成功/失败完成之前运行,否则会出现运行它的线程被杀死的情况?

1 个答案:

答案 0 :(得分:4)

这可能取决于您正在运行Future对抗的执行上下文。

如果您正在使用全局ExecutionContext,则行为是在请求完成后保持Future运行。

据我所知,在请求完成的情况下,我从未见过任何会杀死/中断/取消Future线程的ExecutionContext。请求完成的概念在语言级别不存在,但与您的http层框架更相关,因此只要您不使用来自http层框架的ExecutionContext,就没有理由有这样的行为。