如何处理响应超时?
How to handle response timeout?
在 akka-http 路由中,我可以 return Future
作为隐式转换为 ToResponseMarshaller
.
的响应
有什么方法可以处理这个 future 的超时吗?或者路由级别的连接超时?或者一种方法是使用 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
}
为异步操作添加超时意味着创建一个由操作本身或超时完成的新 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。这应该使用 map
和 recover
:
来完成
future
.map(result => HttpResponse(entity = HttpEntity(MediaTypes.`text/xml`, result)))
.recover { case ex => HttpResponse(entity = utils.getFault("fault")) }
这将是传递给 complete
指令的总体 return 值。
在 akka-http 路由中,我可以 return Future
作为隐式转换为 ToResponseMarshaller
.
有什么方法可以处理这个 future 的超时吗?或者路由级别的连接超时?或者一种方法是使用 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
}
为异步操作添加超时意味着创建一个由操作本身或超时完成的新 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。这应该使用 map
和 recover
:
future
.map(result => HttpResponse(entity = HttpEntity(MediaTypes.`text/xml`, result)))
.recover { case ex => HttpResponse(entity = utils.getFault("fault")) }
这将是传递给 complete
指令的总体 return 值。