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指令的总返回值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- xfire调用webservice[#document: null]问题
- scala – 在Spark SQL表中分解多个列
- bootstrap-table 插件的使用
- angular – 当子组件具有ngModelGroup时,没有ControlContai
- 如何以编程方式等待Shell命令完成运行?
- webservices数据交换-xml格式
- Angular 2 NgModule vs Angular 1 module
- 如何使用设备映射器将docker容器移动到另一台计算机而不使用
- docker Failed to get D-Bus connection: Operation not pe
- 快速解决bootstrap下拉菜单无法隐藏的问题