在 akka-http 响应后,scala 期货是否继续 运行?

Do scala futures continue running after response in akka-http?

我有一个用 akka-http 编写的 REST 服务,它公开了一个 /fire 端点。当那个端点被调用时,我的服务应该发送一个文件,通常是 ~50MB 到不同的服务。但是 /fire 端点应该 return 立即发送给调用者,并以即发即弃的方式继续异步发送文件。

我的实现是这样的

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是保证运行直到successful/failed完成,否则会出现线程中断的情况它 运行 将在哪个上被杀死?

这可能取决于您 运行 您的 Future 反对的 ExecutionContext。

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

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