加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何处理响应超时?

发布时间:2020-12-16 19:10:07 所属栏目:安全 来源:网络整理
导读:在akka-http路由中,我可以将Future作为隐式转换为ToResponseMarshaller的响应返回. 有没有办法处理这个未来的超时?或路由级别的连接超时?或者一种方法是使用Await()函数? 现在客户端可以永远等待响应. complete { val future = for { response - someIOFu
在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
 }

解决方法

向异步操作添加超时意味着创建一个由操作本身或超时完成的新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指令的总返回值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读