scala future 在 akka-http 响应后是否继续运行?

Fr.*_*sai 5 scala fire-and-forget akka spray akka-http

我有一个用 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
}
Run Code Online (Sandbox Code Playgroud)

我测试了一下,效果很好。

然而,当使用 ASP.NET 实现类似的行为时,我需要使用第三方框架 (Hangfire) 来处理异步任务,因为完成的请求生成的线程最终会被终止。

我的问题是:在我的 akka-http 中,sendFile保证运行直到成功/失败完成,或者在某些情况下它运行的线程将被杀死?

Seb*_*ber 4

它可能取决于您正在运行 Future 的 ExecutionContext。

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

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