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

标签 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 发送文件 保证运行直到成功/失败完成,还是会出现运行它的线程将被杀死的情况?

最佳答案

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

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

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

关于scala - 在 akka-http 响应后,Scala future 是否继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537738/

相关文章:

scala - 用于编码/解码 arity 0 的密封特征实例的 Circe 实例?

scala - 在 Specs2 中使用 Akka TestKit

scala - 喷:路由——了解path和pathPrefix的区别

java - 如何在喷雾路由中将Java对象转换为Json

scala - 将外部参数传递给 sbt jar(通过 sbt-assembly 创建)

scala - 是否可以在 Actor 中使用 Akka 调度程序?

java - 在函数参数中维护大型数据结构(对象)?

apache-kafka - Kafka 作为 Akka 持久性日志

java - JVM 的分布式故障安全作业队列

scala - 使用spray/scala从post请求中获取表单参数