5

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

4

1 回答 1

4

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

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

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

于 2016-11-10T22:25:37.383 回答