6

在 akka-http 路由中,我可以Future作为隐式转换为ToResponseMarshaller.

有没有办法处理这个未来的超时?还是路由级别的连接超时?或者一种方法是使用Await()函数?

现在客户可以永远等待响应。

complete {
   val future = for {
     response <- someIOFunc()
     entity <- someOtherFunc()
   } yield entity
   future.onComplete({
     case Success(result) =>
       HttpResponse(entity = HttpEntity(MediaTypes.`text/xml`, result))
     case Failure(result) =>
       HttpResponse(entity = utils.getFault("fault"))
   })
   future
 }
4

1 回答 1

13

为异步操作添加超时意味着创建一个由操作本身或超时完成的新 Future:

import akka.pattern.after
val future = ...
val futureWithTimeout = Future.firstCompletedOf(
    future ::
    after(1.second, system.scheduler)(Future.failed(new TimeoutException)) ::
    Nil
  )

第二个 Future 也可以保存替换错误的成功结果,具体取决于您要建模的确切内容。

附带说明:提供的代码示例包含死代码,在 Future 上注册 onComplete 处理程序仅对副作用有意义,但您似乎想要转换 Future 的值并从中创建一个 HttpEntity 。这应该使用mapand来完成recover

future
  .map(result => HttpResponse(entity = HttpEntity(MediaTypes.`text/xml`, result)))
  .recover { case ex => HttpResponse(entity = utils.getFault("fault")) }

这将是传递给complete指令的整体返回值。

于 2015-03-29T14:00:38.100 回答